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

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


я тоже так думал :( пример дашь ?
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711611
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[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
как заставить new генерить исключения ??
    #34711617
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711635
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Майерс писал, что NULL возвращают старые компиляторы, современные же возвращают исключения. Возможно надо отсюда копать, т.е. разрешить какие-то исключения или использовать какие-то библиотеки....
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711651
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, сделать выделение памяти в одном месте, проверять на NULL и генерить ексепшн

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

ASP 10, gcc 3.3.3 бросает bad_alloc
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711734
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);
        ...
}

но что-то в дебуге все стало проваливаться в бесконечный цикл
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711757
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там вроде про то же самое пишут
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711814
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне начинает казаться, что большинство программ написано без подобных проверок на нехватку памяти, а там где эти проверки все же есть никто не проверял, работают ли они на самом деле, и видимо оно так лучше, ибо, как я сегодня заметил, себе дороже выходит
...
Рейтинг: 0 / 0
как заставить new генерить исключения ??
    #34711869
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
как заставить new генерить исключения ??
    #34712234
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что получается, при исользовании

Код: 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
как заставить new генерить исключения ??
    #34713316
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался вроде, но исключение std::bad_alloc выкидывает оч редко, обычно неизветстное исключение.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / как заставить new генерить исключения ??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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