人为地限制C / C ++内存使用

时间:2010-09-23 01:41:42

标签: c++ c memory-management

有没有办法轻松地将C / C ++应用程序限制到指定的内存量(30 MB左右)?例如:如果我的应用程序试图完成将50mb文件加载到内存中,它将死/打印消息并退出/等。

不可否认,我可以不断检查应用程序的内存使用情况,但如果我超过它就会因为错误而死亡会更容易一些。

有什么想法吗?

平台不是一个大问题,windows / linux /无论编译器。

5 个答案:

答案 0 :(得分:10)

阅读unix系统上ulimit的手册页。有一个内置的shell,您可以在启动可执行文件之前调用,或者(在手册的第3部分中)调用相同名称的API调用。

答案 1 :(得分:7)

在Windows上,您无法直接为进程的内存使用量设置配额。但是,您可以创建Windows作业对象,设置作业对象的配额,然后将该过程分配给该作业对象。

答案 2 :(得分:5)

在bash中,使用ulimit builtin

bash$ ulimit -v 30000
bash$ ./my_program

-v需要1K块。

<强>更新

如果您想在应用中进行设置,请使用setrlimit。请注意,ulimit(3)的手册页明确表示它已过时。

答案 3 :(得分:4)

覆盖所有malloc API,并为new / delete提供处理程序,以便您可以预订内存使用情况并在需要时抛出异常。

不确定这是否比通过OS提供的API进行内存监控更容易/省力。

答案 4 :(得分:2)

您可以使用系统限制限制流程虚拟内存的大小。如果你的处理超过这个数量,它将被一个信号杀死(我认为是SIGBUS)。

您可以使用以下内容:

#include <sys/resource.h>
#include <iostream>

using namespace std;

class RLimit {
public:
    RLimit(int cmd) : mCmd(cmd) {
    }

    void set(rlim_t value) {
        clog << "Setting " << mCmd << " to " << value << endl;
        struct rlimit rlim;
        rlim.rlim_cur = value;
        rlim.rlim_max = value;
        int ret = setrlimit(mCmd, &rlim);
        if (ret) {
            clog << "Error setting rlimit" << endl;
        }
    }

    rlim_t getCurrent() {
        struct rlimit rlim = {0, 0};
        if (getrlimit(mCmd, &rlim)) {
            clog << "Error in getrlimit" << endl;
            return 0;
        }
        return rlim.rlim_cur;
    }
    rlim_t getMax() {
        struct rlimit rlim = {0, 0};
        if (getrlimit(mCmd, &rlim)) {
            clog << "Error in getrlimit" << endl;
            return 0;
        }
        return rlim.rlim_max;
    }

private:
    int mCmd;
};

然后像这样使用它:

RLimit dataLimit(RLIMIT_DATA);
dataLimit.set(128 * 1024 );  // in kB
clog << "soft: " << dataLimit.getCurrent() << " hard: " << dataLimit.getMax() << endl;

这个实现看起来有点冗长,但它可以让您轻松,干净地设置不同的限制(请参阅ulimit -a)。