使用C++模拟低内存条件

5

我正在调试一个在低内存情况下失败的程序,希望有一个C++程序能够消耗大量内存。任何指针都会有所帮助!


17
"任何指针都会有所帮助!" - 考虑到问题,这很有趣。 - KeatsPeeks
13
0x3A28213A 0x6339392C 0x7363682E抱歉,这些都是十六进制编码,没有具体的文本内容可以翻译。 - Pete H.
2
孔子说:问题就是答案。 - T.E.D.
2
可能的重复问题:https://dev59.com/pXM_5IYBdhLWcg3wymU0#1229277 和 https://dev59.com/4HVD5IYBdhLWcg3wDG_m - Rob Kennedy
最好使用指向大块已分配内存的指针... - JohnMcG
6个回答

12

您是否在Windows平台上(看起来可能不是 :))?如果您正在使用Windows系统,AppVerifier 有一个低内存仿真模式。请参阅“低资源仿真测试”。


+1 我自己没有使用过AppVerifier,但像这样的工具确实是一个更好的选择。在你的低权限环境中,你不希望系统上的所有东西(比如调试器!)都受到影响。 - luke

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

7

涂覆大块是行不通的。

  • 根据操作系统,您不仅限于实际的物理内存,未使用的大块可能会被潜在地交换到磁盘上。
  • 此外,这使得在您想要它失败时让您的内存精确地失败非常困难。

您需要编写自己的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

1
有可能只需链接一个替换版本的malloc(),该版本在需要时返回null,就可以获得更好的覆盖率(或者两者都使用,以防内置的new不使用malloc()),这样如果任何代码使用malloc()将同时失败,如果使用new(nothrow),它仍然会失败。 - Clifford
new/delete 不一定需要使用 malloc/free。因此,您需要检查实现文档以了解其底层工作原理。有关更多详细信息,请参见 https://dev59.com/f3VC5IYBdhLWcg3wnCaA#240308。 - Martin York
将一个带有特殊版本malloc/free的新库链接可能会有问题,但这并非不可能。但从技术上讲,标准不支持这种行为(尽管商业工具确实这样做了(但他们有开发团队正在解决这个问题))。 - Martin York
是否有一种方法可以告诉Visual Studio,Windows,GCC或Linux限制可执行的内存环境?例如,我们有一个嵌入式系统的仿真器,其内存受限,比如640MB。我们希望仿真器使用相同的内存限制(因为调试更容易)。 - Thomas Matthews
是的,Thomas。请查看我在此问题评论中提供的重复链接。或者请查看关于AppVerifier和ulimit的答案。 - Rob Kennedy

3

编写一个C++应用程序,创建一个巨大的数组。


1
您可能需要禁用虚拟内存管理器(限制操作系统仅使用物理内存)。您甚至可以从系统中删除一些内存,以加快内存不足的速度。 - Mordachai
这里的问题在于很难编写在任何环境下都能一致失败的测试。 - Martin York

2

我知道这是一种内存泄漏,但指针会有所帮助 :)

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

分配大块内存最终会失败。但这并不能帮助以可控的方式使其失败。此外,操作系统将将页面交换到磁盘上,因为它不受物理RAM限制的限制。 - Martin York

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接