Operator new
Martin Horcicka
mhor5157 at ss1000.ms.mff.cuni.cz
Wed Sep 30 11:35:28 CEST 1998
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