Имитация нехватки памяти с помощью C ++ - PullRequest
5 голосов
/ 17 декабря 2009

Я отлаживаю программу, которая дает сбой при нехватке памяти и хотела бы программу на C ++, которая просто потребляет много памяти. Любые указатели помогут!

Ответы [ 6 ]

12 голосов
/ 17 декабря 2009

Вы на платформе Windows (глядя на имя пользователя ... возможно, нет :)) Если вы находитесь на земле Windows, AppVerifier имеет режим симуляции с низким объемом памяти. См. Тест имитации низкого ресурса.

9 голосов
/ 17 декабря 2009

Если вы используете Unix или Linux, я бы предложил использовать ulimit:

bash$ ulimit -a
core file size        (blocks, -c) unlimited
data seg size         (kbytes, -d) unlimited
...
stack size            (kbytes, -s) 10240
...
virtual memory        (kbytes, -v) unlimited
7 голосов
/ 17 декабря 2009

Большие блоки с покрытием не будут работать.

  • В зависимости от операционной системы вы не ограничены реальной физической памятью, и неиспользованные большие блоки могут потенциально просто быть выгружены на диск.
  • Кроме того, это очень затрудняет сбой вашей памяти именно тогда, когда вы хотите, чтобы он вышел из строя.

Что вам нужно сделать, так это написать собственную версию команды new / delete, которая не выполняется по команде.

Что-то вроде этого:

#include <memory>
#include <iostream>



int memoryAllocFail = false;

void* operator new(std::size_t size)
{
    std::cout << "New Called\n";
    if (memoryAllocFail)
    {   throw std::bad_alloc();
    }

    return ::malloc(size);
}

void operator delete(void* block)
{
    ::free(block);
}

int main()
{
    std::auto_ptr<int>  data1(new int(5));

    memoryAllocFail = true;
    try
    {
        std::auto_ptr<int>  data2(new int(5));
    }
    catch(std::exception const& e)
    {
        std::cout << "Exception: " << e.what() << "\n";
    }
}
> g++ mem.cpp
> ./a.exe
New Called
New Called
Exception: St9bad_alloc
3 голосов
/ 17 декабря 2009

Просто напишите приложение на c ++, которое создает гигантский массив

2 голосов
/ 17 декабря 2009

Я знаю, что это утечка, но указатели помогут :)

int main()
{
    for(;;)
    {
        char *p = new char[1024*1024];
    }
    // optimistic return :)
    return 0;
}
0 голосов
/ 17 декабря 2009

Подобный вопрос был задан здесь, и он был моим ответом. Как заставить программу показывать нехватку памяти?

В Linux команда ulimit, вероятно, то, что вы хотите.

Возможно, вы захотите использовать ulimit -v для ограничения объема виртуальной памяти, доступной вашему приложению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...