Operator new

Martin Horcicka mhor5157 at ss1000.ms.mff.cuni.cz
Mon Oct 5 11:13:27 CEST 1998


V te smrsti mailu z netlab.sk muj prispevek nejak zaniknul, tak ho posilam
jeste jednou.

---------- Forwarded message ----------
Date: Wed, 30 Sep 1998 11:35:28 +0200 (MET DST)
From: Martin Horcicka <mhor5157 at ss1000.ms.mff.cuni.cz>
Reply-To: users-l at freebsd.cz
To: users-l at freebsd.cz
Subject: Operator new


Zdravim vsechny,
mam problem s g++ a vzhledem k tomu, ze se mimo jine distribuuje s
FreeBSD, adresuji ho k vam.

Predstavte si nasledujici programek, ktery je zhruba podle standardu c++:
-------------------------------------------------------------------------
#include <new>
#include <iostream>

int main()
{
  char *p;

  try {
    p = new char[500000000];
  }
  catch (bad_alloc &e) {
    cout << "Vyjimka\n";
  }

  return 0;
}
----------------------------------------------------------------

Ve std c++ normalni operator new nikdy nevraci NULL a kdyz nemuze
alokovat pozadovanou pamet, vraci vyjimku bad_alloc.
Tenhle programek prelozeny s egcs-2.91.22 funguje tak jak ma - tedy vypise
slovo Vyjimka. g++ 2.7.2.1 to neprelozi ani nahodou - fajn nebudu mu to
zazlivat - od schvaleni standardu uplynulo teprve 3/4 roku.

Predstavte si programek upraveny pro g++:
-----------------------------------------
#include <iostream.h>

int main()
{
  char *p;

  try {
    p = new char[500000000];
  }
  catch (...) {
    cout << "Vyjimka\n";
  }

  if (!p)
    cout << "NULL\n";

  return 0;
}
----------------------------------------

prelozeny: g++ -Wall -fhandle-exceptions jmeno_souboru
V tomto pripade se nevypise ani Vyjimka ani NULL, nybrz
"Virtual memory exceeded in `new'". No to uz je trochu neprijemne, ale
rekneme, ze g++ neumi dobre vyjimky.

Predstavte si totez bez vyjimek:
--------------------------------
#include <iostream.h>

int main()
{
  char *p;

  p = new char[500000000];

  if (!p)
    cout << "NULL\n";

  return 0;
}
--------------------------------

prelozeno: g++ -Wall jmeno_souboru
Po spusteni ale znovu tvrdosijne hlasi
"Virtual memory exceeded in `new'". Tak nevim - je u g++ nejaka moznost
jak otestovat, zda se alokovala potrebna pamet a pritom neukoncit program?

Podotykam, ze programek v C:
----------------------------
#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *p;

  p = (char *) malloc(500000000);

  if (p == NULL)
    printf("NULL\n");

  return 0;
}
-----------------------------

funguje bezvadne - vypise NULL.

Vsechno jsem to zkousel pod g++ 2.7.2.1 a 2.7.2.3 na FreeBSD 2.2.5,
Irixu 6.2 a Linuxu 2.1.77 - vsude je to totez. Nenasel jsem ani zadny
option g++, kterym by se to dalo zmenit.

Mate nekdo nejakou ideu?


                                                 Martin

PS: Omlouvam se za dost dlouhy mail.




More information about the Users-l mailing list