Я отлаживаю программу, которая перестала работать во время низкой ситуации с памятью и хотела бы программу C++, которая просто использует ПАРТИЮ памяти. Любые указатели помогли бы!
Allcoating больших блоков не будет работать.
Что вам нужно сделать, так это написать свою собственную версию 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
Are you on the Windows platform (looking at the username...perhaps not :) ) If you are in Windows land, AppVerifier has a low memory simulation mode. See the Low Resource Simulation test.
Если вы используете 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
Я знаю, что это утечка, но указатели будут help :)
int main()
{
for(;;)
{
char *p = new char[1024*1024];
}
// optimistic return :)
return 0;
}
Здесь был задан аналогичный вопрос, и это был мой ответ. Как заставить программу работать с нехваткой памяти?
В Linux, вероятно, вам нужна команда ulimit
.
Возможно, вы захотите использовать ulimit -v
, чтобы ограничить объем виртуальной памяти, доступной вашему приложению.