代码之家  ›  专栏  ›  技术社区  ›  Paul

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

  •  14
  • Paul  · 技术社区  · 14 年前

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

    诚然,我可以不断地检查应用程序的内存使用情况,但是如果我在上面的话,它会因为一个错误而消失,这会更容易一些。

    有什么想法吗?

    平台不是大问题,windows/linux/whatever编译器。

    5 回复  |  直到 7 年前
        1
  •  10
  •   dmckee --- ex-moderator kitten    14 年前

    阅读手册页 ulimit 在Unix系统上。您可以调用一个shell内置函数 之前 启动可执行文件或(在手册第3节中)同名的API调用。

        2
  •  7
  •   Jerry Coffin    14 年前

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

        3
  •  5
  •   bstpierre Edgar Aviles    14 年前

    在bash中,使用 ulimit builtin :

    bash$ ulimit -v 30000
    bash$ ./my_program
    

    V需要1K块。

    更新:

    如果要在应用程序中设置此项,请使用 setrlimit . 注意手册页 ulimit(3) 明确地说它已经过时了。

        4
  •  4
  •   Arthur    14 年前

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

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

        5
  •  2
  •   Raúl Salinas-Monteagudo Jörg W Mittag    7 年前

    可以使用系统限制来限制进程的虚拟内存大小。如果您的进程超过这个数量,它将被一个信号杀死(我想是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 )