можно ли програмно ограничить размер кучи так, чтоб, скажем, new char[100] гарантированно завалилась.
hawk Просто есть библиотечка на С++. Все аллокации там с new. Нужно посмотреть как она себя ведет в условиях недостатка памяти.
heapCreate для этого вам разве не подходит? и в условиях недостатка памяти-это в каком плане?когда вы выйдите за пределы памяти статистического массива или больше размера секции. Если выйти за пределы char E[N],то мы просто затрём все те элементы которые будут распологаться за массивом E в секции данных.А вот выход за пределы выделенной памяти динамического массива,это другой вопрос.
а вообще ,при работе с оператором new имеет место быть следующая ситуация: поскольку объём кучи ограничен,память может оказаться исчерпанной.Вэтом случае оператор new сгенерирует исключительную ситуацию bad_alloc,определённую в заголовке <new>.если в программе не предусмотренна обработка такой исключительной ситуации ,её выполнение будет прервана. это вас интересовало?
Не совсем. Ведь new работает с уже готовой кучей созданной при запуске процесса. То, что new бросает исключения - понятно. В коде библиотеки, которую я хочу проверить, наблюдается обработка исключений. Но хотелось бы проверить насколько все обработчики исключений работают верно. Поэтому и хотелось бы програмно лимитировать объем доступной памяти и вызвать нек. функцию из библиотеки.
Если я тебя правильно понял(т.е. тебе нада чтобы винда те не выдала кучу по умолчанию), тода Project -> Propetries -> Linker -> System -> Heap Reserve Size && Heap Commit Size. GL
Ещё можно джобом ограничить размер доступной памяти для проги. http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
Вы сделали неправильный вывод. Вам не нужно лимитировать объем доступной памяти. Пусть был код: Код (Text): void SomeClass::func() { try{ ComplexType* type = new ComplexType();//a хватит ли нам памяти? ... }catch(Exception e) { ... } } Преобразуешь его в следующий Код (Text): void SomeClass::func() { try{ ComplexType* type = createComplexType(); ... }catch(Exception e) { ... } } ComplexType* SomeClass::createComplexType()//можно сделать protected, чтобы не мешалась в автокомплите { return new ComplexType(); } А потом переопределяешь функцию createComplexType() так, чтобы она бросала исключение. Это стандартный подход при использовании *unit framework'ов. Подробности можно почитать в книгах по junit.