Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / как заставить new генерить исключения ?? / 16 сообщений из 16, страница 1 из 1
07.08.2007, 15:35
    #34711191
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
как заставить new генерить исключения ?? у меня возвращает NULL, если не удается выделить блок памяти в VS. Хорошо, что проверил, т.к. думал наоборот, что всегда генерятся исключения если не поставить nothrow.

Эту же прогульку придется портировать под никс, как сделать, чтобы там тоже были исключения у new гарантированно?
...
Рейтинг: 0 / 0
07.08.2007, 15:58
    #34711288
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
P.S. в релизе собирается с исключениями
...
Рейтинг: 0 / 0
07.08.2007, 16:46
    #34711522
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Дык сравни настройки компилятора в дебуге и релизе
и выстави соответственно
...
Рейтинг: 0 / 0
07.08.2007, 16:52
    #34711564
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Tubrikт.к. думал наоборот, что всегда генерятся исключения если не поставить nothrow.


я тоже так думал :( пример дашь ?
...
Рейтинг: 0 / 0
07.08.2007, 17:04
    #34711611
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
[quot Gluk (Kazan)][quot Tubrik]т.к. думал наоборот, что всегда генерятся исключения если не поставить nothrow.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[/quot]

я тоже так думал :( пример дашь ?[/quot]

пример чего? просто в цикле в fucn()
[SRC c++]
	unsigned long *tmp;

	while (true)
	{
		tmp = new unsigned long[ 4194304  *  1048576 ];

		if (!tmp)
			printf("\n> NULL");
	}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        try
	{
		func()
	}// try
	catch(Accepter::Except)
	{
		...
	}
	catch(bad_alloc ba)
	{
		...
	}
	catch(...)
	{
                ...
	}



проект затачивал под обработку исключений и так мне на самом деле проще, чем каждый раз проверять на NULL
...
Рейтинг: 0 / 0
07.08.2007, 17:05
    #34711617
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
...
Рейтинг: 0 / 0
07.08.2007, 17:10
    #34711635
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Майерс писал, что NULL возвращают старые компиляторы, современные же возвращают исключения. Возможно надо отсюда копать, т.е. разрешить какие-то исключения или использовать какие-то библиотеки....
...
Рейтинг: 0 / 0
07.08.2007, 17:12
    #34711651
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Как вариант, сделать выделение памяти в одном месте, проверять на NULL и генерить ексепшн

не айс ?
...
Рейтинг: 0 / 0
07.08.2007, 17:14
    #34711667
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
вот большое обсуждалово на эту тему
...
Рейтинг: 0 / 0
07.08.2007, 17:22
    #34711712
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Tubrik
Эту же прогульку придется портировать под никс, как сделать, чтобы там тоже были исключения у new гарантированно?

ASP 10, gcc 3.3.3 бросает bad_alloc
...
Рейтинг: 0 / 0
07.08.2007, 17:27
    #34711734
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
щас почитаю, пока попробовал сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int _cdecl my_new_handler(size_t)
{
	throw std::bad_alloc();
	return  0 ;
}

int main(int argc, char* argv[])
{
	_set_new_handler(my_new_handler);
        ...
}

но что-то в дебуге все стало проваливаться в бесконечный цикл
...
Рейтинг: 0 / 0
07.08.2007, 17:32
    #34711757
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
там вроде про то же самое пишут
...
Рейтинг: 0 / 0
07.08.2007, 17:44
    #34711814
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
мне начинает казаться, что большинство программ написано без подобных проверок на нехватку памяти, а там где эти проверки все же есть никто не проверял, работают ли они на самом деле, и видимо оно так лучше, ибо, как я сегодня заметил, себе дороже выходит
...
Рейтинг: 0 / 0
07.08.2007, 17:54
    #34711869
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Tubrikщас почитаю, пока попробовал сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int _cdecl my_new_handler(size_t)
{
	throw std::bad_alloc();
	return  0 ;
}

int main(int argc, char* argv[])
{
	_set_new_handler(my_new_handler);
        ...
}

но что-то в дебуге все стало проваливаться в бесконечный цикл

Про эти вещи очень подробно Майерс во второй книге расписал. На rsdn обсуждали, что можно делать в хандлере.
...
Рейтинг: 0 / 0
07.08.2007, 19:40
    #34712234
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
вот что получается, при исользовании

Код: plaintext
1.
2.
3.
4.
int __cdecl my_new_handler(size_t)
{
	throw std::bad_alloc();
	return  0 ;
}

в дебажной версии исключение происходит, но оно не отлавливается, будто бы вызвано не из блока try, т.е. когда выделение new происходит вообще в другом модуле, то catch не срабатывает даже с (...)

сделал тестовую программульку для лучшего понимания:)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#include	"stdafx.h"
#include	<new.h>	
#include	<exception>

using namespace std;

int __cdecl my_new_handler(size_t)
{
	throw std::bad_alloc();
	return  0 ;
}
void main()
{
        _set_new_handler(my_new_handler);
	char	*tmp;

	 throw std::bad_alloc();// нечаянно вызвал здесь

	try
	{
		while (true)
		{
			tmp = new char [ 1099511627776 ];

			if (!tmp)
				printf("\nNULL");
		}
	}// try
	catch(std::bad_alloc ba)
	{
		fprintf(stderr, "FATAL ERROR(main): there is no sufficient virtual memory: make the swap file larger or add RAM card"); 
	}
	catch(...)
	{
		fprintf(stderr, "FATAL ERROR(main): Unknown exception");
	}
}

вот в кратце что вышло...

запустив релиз отдельно от оболочки ctrl + F5 отлавливается исключение std::bad_alloc !, хотя вообще не должно, в оболочке - не отлавливается
----------------------------------------------------
далее перемещаю throw std::bad_alloc(); внутрь блока try - все работает как положено и дебуге, и в релизе
----------------------------------------------------
убираю throw std::bad_alloc(); вообще из main(), в дебаге (при первой поптытке ребилда падает студия - молча исчезает), а вообще срабатывает catch(...), но почему он??
в релизе студия продолжает регулярно схлопываться - видимо ее разработчки не не проверяли выделение памяти :), но catch срабатывает как нужно
...
Рейтинг: 0 / 0
08.08.2007, 11:59
    #34713316
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заставить new генерить исключения ??
Разобрался вроде, но исключение std::bad_alloc выкидывает оч редко, обычно неизветстное исключение.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / как заставить new генерить исключения ?? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]