Здравствуйте, Аноним, Вы писали:
А>Привет!
А>Поспорил тут с человеком по поводу того, возвращает ли new в MSVC7 (C++, not managed) ноль, или кидает исключение.
А>Мне кажется, что должен кидать. Если это действительно так, посоветуйте, пожалуйста, как лучше это доказать.
А>Спасибо.
Обычная форма new кидает исключение bad_alloc.
Но если записать:
int *k_arr = new (std::nothrow) int[UINT_MAX]; // allocation will fail
то исключения небудет, но перед использованием указатель нужно проверить на NULL.
ГС>Обычная форма new кидает исключение bad_alloc. ГС>Но если записать: ГС> int *k_arr = new (std::nothrow) int[UINT_MAX]; // allocation will fail ГС>то исключения небудет, но перед использованием указатель нужно проверить на NULL.
Это по стандарту так все должно быть. А вот допустим в VC 6.0 по-моему было неправильно — ноль возвращался.
А сгенерить исключение, ну так попробуй так
try{
for(;;)
int * p = new int[10000000];//:))if(!p)break;
}
catch(std::bad_alloc)
{
//попадешь ли ты сюда?
}
Of course, the code must be complete enough to compile and link.
#include <iostream>
#include <vector>
#include <new>
int main()
{
std::vector<int *>v_p;
v_p.reserve(1000);
try{
for(;;)
{
int * p = new int[10000000];
v_p.push_back(p);
}
}
catch(std::bad_alloc)
{
//try to free some memoryfor(int i = 0; i < v_p.size(); ++i)
delete [] v_p[i];
std::cout<<"Bad alloc was thrown and catched and now the memory was freed\n";
std::cout<<"Number of succesfull allocations == "<<v_p.size()<<std::endl;
}
return 0;
}
У меня на 77 попвтке было сгенерировано исключение. Правда это г++
Of course, the code must be complete enough to compile and link.
Re[3]: operator new, return 0 и MSVC 7
От:
Аноним
Дата:
29.04.03 11:12
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
ГС>Обычная форма new кидает исключение bad_alloc. ГС>Но если записать: ГС> int *k_arr = new (std::nothrow) int[UINT_MAX]; // allocation will fail ГС>то исключения небудет, но перед использованием указатель нужно проверить на NULL.
L_L>Это по стандарту так все должно быть. А вот допустим в VC 6.0 по-моему было неправильно — ноль возвращался.
L_L>А сгенерить исключение, ну так попробуй так L_L>
L_L>try{
L_L>for(;;)
L_L> int * p = new int[10000000];//:))
L_L> if(!p)break;
L_L>}
L_L>catch(std::bad_alloc)
L_L>{
L_L> //попадешь ли ты сюда?
L_L>}
L_L>
Да, действительно, MSVC7 несовсем соотв. стандарту в этом отношении. Если не подключена STL (напр., iostream), new возвращает 0. Иначе -- кидает исключение.