operator new, return 0 и MSVC 7
От: Аноним  
Дата: 29.04.03 10:32
Оценка:
Привет!

Поспорил тут с человеком по поводу того, возвращает ли new в MSVC7 (C++, not managed) ноль, или кидает исключение.

Мне кажется, что должен кидать. Если это действительно так, посоветуйте, пожалуйста, как лучше это доказать.

Спасибо.
Re: operator new, return 0 и MSVC 7
От: Ганзий Сергей Украина  
Дата: 29.04.03 10:47
Оценка: 5 (1)
Здравствуйте, Аноним, Вы писали:

А>Привет!


А>Поспорил тут с человеком по поводу того, возвращает ли new в MSVC7 (C++, not managed) ноль, или кидает исключение.


А>Мне кажется, что должен кидать. Если это действительно так, посоветуйте, пожалуйста, как лучше это доказать.


А>Спасибо.

Обычная форма new кидает исключение bad_alloc.
Но если записать:
int *k_arr = new (std::nothrow) int[UINT_MAX]; // allocation will fail
то исключения небудет, но перед использованием указатель нужно проверить на NULL.
Re[2]: operator new, return 0 и MSVC 7
От: Lorenzo_LAMAS  
Дата: 29.04.03 10:58
Оценка:
ГС>Обычная форма 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.
Re: operator new, return 0 и MSVC 7
От: Lorenzo_LAMAS  
Дата: 29.04.03 11:09
Оценка:
Я тут доработал пример.
#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 memory
    for(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. Иначе -- кидает исключение.

Спасибо.
Re: operator new, return 0 и MSVC 7
От: ssm Россия  
Дата: 29.04.03 11:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне кажется, что должен кидать. Если это действительно так, посоветуйте, пожалуйста, как лучше это доказать.



#include <memory>
#include <iostream>

int main(int argc, char* argv[])
{
    size_t block_sz = 100 * 1024 * 1024;
    try{
        while(new char[block_sz])
            ;
        std::cout << "return 0" << std::endl;
    }
    catch(const std::exception &e){
        std::cout << e.what() << std::endl;
    }
    return 0;
}
Re[2]: operator new, return 0 и MSVC 7
От: Аноним  
Дата: 29.04.03 11:17
Оценка:
Здравствуйте, ssm, Вы писали:

А>Мне кажется, что должен кидать. Если это действительно так, посоветуйте, пожалуйста, как лучше это доказать.



ssm>
ssm>#include <memory>
ssm>#include <iostream>

ssm>int main(int argc, char* argv[])
ssm>{
ssm>    size_t block_sz = 100 * 1024 * 1024;
ssm>    try{
ssm>        while(new char[block_sz])
ssm>            ;
ssm>        std::cout << "return 0" << std::endl;
ssm>    }
ssm>    catch(const std::exception &e){
ssm>        std::cout << e.what() << std::endl;
ssm>    }
ssm>    return 0;
ssm>}
ssm>


С подключенным STL. Без него не кидает.

Спаисибо.
Re[3]: operator new, return 0 и MSVC 7
От: ssm Россия  
Дата: 29.04.03 11:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>С подключенным STL. Без него не кидает.


Тоесть? Что значит с "подключеным"?
Re[4]: operator new, return 0 и MSVC 7
От: Аноним  
Дата: 29.04.03 11:25
Оценка:
Здравствуйте, ssm, Вы писали:

А>С подключенным STL. Без него не кидает.


ssm>Тоесть? Что значит с "подключеным"?



#include <что-нибудь включающее в себя #include<new> >
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.