2009-12-17 3 views
5

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

+17

"Все указатели помогут!" - Это смешно, учитывая вопрос – KeatsPeeks

+0

Я предлагаю Photoshop ... хех. – Aaron

+13

0x3A28213A 0x6339392C 0x7363682E –

ответ

7

Разметка больших блоков не сработает.

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

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

Somthing так:

#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 
+1

Возможно, что простое связывание заменяющей версии malloc(), которая возвращает null по требованию, даст лучший охват (или, возможно, оба варианта, если встроенный новый не использует malloc()), так что если в каком-либо коде используется malloc () будет сбой в одно и то же время, и если новый (nothrow) будет использоваться, он все равно будет терпеть неудачу. – Clifford

+0

Для использования/malloc/free не требуется новое/удалить. Поэтому вам нужно будет проверить свою документацию по внедрению, чтобы увидеть, как она работает под капотом. См. Http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free/240308#240308 для получения более подробной информации. –

+0

. Связывание в новом lib со специальной версией malloc/free может быть проблемным, но это невозможно. Но технически стандарт не поддерживает такое поведение (хотя коммерческие инструменты делают именно это (но у них есть команды разработчиков, которые работают над проблемой)). –

2

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

int main() 
{ 
    for(;;) 
    { 
     char *p = new char[1024*1024]; 
    } 
    // optimistic return :) 
    return 0; 
} 
+0

Выделение огромных кусков в конечном итоге не удастся. Но это не помогает сделать это неудачно. Кроме того, ОС будет заменять страницы на диск, поскольку это не ограничено физическими пределами RAM. –

12

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

+0

+1 Я не использовал AppVerifier сам, но что-то вроде этого - гораздо лучшая идея. Вы не хотите, чтобы все в вашей системе страдало (как ваш отладчик!) В вашей ситуации с низким членством. – luke

3

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

+1

Возможно, вам придется отключить диспетчер виртуальной памяти (ограничьте OS только физической памятью). Вы даже можете зайти так далеко, чтобы удалить некоторую оперативную память из вашей системы, чтобы ускорить темп, на котором вы находитесь на баре. – Mordachai

+0

Проблема в том, что трудно писать тесты, которые не всегда стабильны в любой среде. –

9

Если вы используете 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 
0

Аналогичный вопрос здесь был задан вопрос и htis был мой ответ. How do I force a program to appear to run out of memory?

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

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

Смежные вопросы