C ++更改最大RAM限制

时间:2011-11-03 15:34:52

标签: c++ c unix memory-limit

如何更改程序的最大RAM数量?我一直在耗尽内存(不是系统max,ulimit max),我不想改变全局内存限制。我环顾四周,看到vlimit()函数可能有效,但我不确定如何使用它。

编辑:我在linux 2.6.38-11-generic上 这不是内存泄漏,我实际上必须分配给定类的100k,没有办法解决它。

4 个答案:

答案 0 :(得分:3)

您是否在堆栈上分配对象并且实际上达到了堆栈限制?

你是否,例如,写下这样的东西:

void SomeFunction() {
    MyObject aobject[100000];
    // do something with myobject
}

此数组将在堆栈上分配。一个更好的解决方案 - 自动为您分配堆 - 将是写

void SomeFunction() {
    std::vector<MyObject> veccobject(100000); // 100.000 default constructed objects
    // do something with myobject
}

如果由于某种原因,您确实需要更大的堆栈,请查阅编译器文档以获取相应的标志:

How to increase the gcc executable stack size?

Can you set the size of the call stack in c++? (vs2008)

您可能需要考虑:

When do you worry about stack size?

答案 1 :(得分:2)

如果系统管理员对您施加了这些限制,那么不会 - 您被卡住了。如果你是ulimit自己,请确保 - 只需提高软限制和硬限制。

正如Chris在评论中指出的那样,如果您是一个特权流程,您可以使用setrlimit来提高您的硬限制。但是,如果您处于ulimit之下,则可以假定您不太可能成为特权流程。

答案 2 :(得分:2)

您是否理解为什么要达到RAM限制?您确定没有内存泄漏(如果您确实有泄漏,则需要在运行应用程序较长时间时,RAM越来越多。)

假设有一台Linux机器,你可以使用valgrind来搜寻和调试内存泄漏,你也可以使用Boehm's conservative garbage collector来避免它们。

答案 3 :(得分:1)

如果您有权限,可以使用setrlimit调用(取代vlimit)在程序开头设置限制。这只会影响这个程序及其后代。

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

int main() {
  struct rlimit limit;
  limit.rlim_cur = RLIM_INFINITY;
  limit.rlim_max = RLIM_INFINITY;
  if (0 != setrlimit(RLIMIT_AS, &limit)) {
  //errro
  } 
}