можно ли ограничить размер кучи

Тема в разделе "LANGS.C", создана пользователем katrus, 2 янв 2009.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    можно ли програмно ограничить размер кучи так, чтоб, скажем, new char[100] гарантированно завалилась.
     
  2. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    не моглибы вы поточнее сформулировать вопрос.
    макс.размер кучи указывается в heapcreate.
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    hawk
    Просто есть библиотечка на С++. Все аллокации там с new. Нужно посмотреть как она себя ведет в условиях недостатка памяти.
     
  4. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    heapCreate для этого вам разве не подходит?
    и в условиях недостатка памяти-это в каком плане?когда вы выйдите за пределы памяти статистического массива или больше размера секции.
    Если выйти за пределы char E[N],то мы просто затрём все те элементы которые будут распологаться за массивом E в секции данных.А вот выход за пределы выделенной памяти динамического массива,это другой вопрос.
     
  5. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    а вообще ,при работе с оператором new имеет место быть следующая ситуация:
    поскольку объём кучи ограничен,память может оказаться исчерпанной.Вэтом случае оператор new сгенерирует исключительную ситуацию bad_alloc,определённую в заголовке <new>.если в программе не предусмотренна обработка такой исключительной ситуации ,её выполнение будет прервана.

    это вас интересовало?
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Не совсем. Ведь new работает с уже готовой кучей созданной при запуске процесса.

    То, что new бросает исключения - понятно. В коде библиотеки, которую я хочу проверить, наблюдается обработка исключений. Но хотелось бы проверить насколько все обработчики исключений работают верно. Поэтому и хотелось бы програмно лимитировать объем доступной памяти и вызвать нек. функцию из библиотеки.
     
  7. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    heapmax юзал.Так можно задать максимальный размер кучи.ОНО?
     
  8. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Что это такое? Функция? Что то не могу найти в google.
     
  9. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Если я тебя правильно понял(т.е. тебе нада чтобы винда те не выдала кучу по умолчанию), тода Project -> Propetries -> Linker -> System -> Heap Reserve Size && Heap Commit Size. GL
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ещё можно джобом ограничить размер доступной памяти для проги.
    http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
     
  11. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    переопредели operator new и возбуждай исключение сам, если выделено, скажем, больше 100 кб.
     
  12. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Вы сделали неправильный вывод. Вам не нужно лимитировать объем доступной памяти. Пусть был код:
    Код (Text):
    1.   void SomeClass::func()
    2.   {
    3.     try{
    4.            ComplexType* type = new ComplexType();//a хватит ли нам памяти?
    5.            ...
    6.     }catch(Exception e)
    7.     {
    8.            ...
    9.     }
    10.   }
    Преобразуешь его в следующий
    Код (Text):
    1.   void SomeClass::func()
    2.   {
    3.     try{
    4.            ComplexType* type = createComplexType();
    5.            ...
    6.     }catch(Exception e)
    7.     {
    8.            ...
    9.     }
    10.   }
    11.   ComplexType* SomeClass::createComplexType()//можно сделать protected, чтобы не мешалась в автокомплите
    12.   {
    13.      return new ComplexType();
    14.   }
    А потом переопределяешь функцию createComplexType() так, чтобы она бросала исключение. Это стандартный подход при использовании *unit framework'ов. Подробности можно почитать в книгах по junit.