C++ C++;更改最大RAM限制

C++ C++;更改最大RAM限制,c++,c,unix,memory-limit,C++,C,Unix,Memory Limit,如何更改程序的最大RAM量?我一直在耗尽内存(不是system max、ulimit max),我不希望更改全局内存限制。我环顾四周,发现vlimit()函数可能会工作,但我不确定该如何使用它 编辑:我使用的是linux 2.6.38-11-generic 这不是内存泄漏,我必须为给定的类分配100k内存,这是无法避免的。如果系统管理员对您施加了这些限制,那么不-您被卡住了。如果你想限制自己,当然,只要提高软限制和硬限制就行了 正如Chris在评论中指出的,如果您是一个特权流程,您可以在流程中提

如何更改程序的最大RAM量?我一直在耗尽内存(不是system max、ulimit max),我不希望更改全局内存限制。我环顾四周,发现vlimit()函数可能会工作,但我不确定该如何使用它

编辑:我使用的是linux 2.6.38-11-generic
这不是内存泄漏,我必须为给定的类分配100k内存,这是无法避免的。

如果系统管理员对您施加了这些限制,那么不-您被卡住了。如果你想限制自己,当然,只要提高软限制和硬限制就行了


正如Chris在评论中指出的,如果您是一个特权流程,您可以在流程中提高您的硬限制。但是,有人假设,如果您处于
ulimit
,那么您不太可能是一个特权进程。

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


假设是Linux机器,您可以使用查找和调试内存泄漏,也可以经常使用来避免它们。

如果您有权限,可以使用调用(取代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
  } 
} 
#包括
#包括
int main(){
结构极限;
limit.rlim_cur=rlim_无穷大;
limit.rlim_max=rlim_无穷大;
如果(0!=setrlimit(RLIMIT_AS,&limit)){
//埃罗
} 
} 

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

例如,你写过这样的东西吗:

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
}
void SomeFunction(){
std::vector向量对象(100000);//100.000默认构造的对象
//用myobject做点什么
}
如果出于某种原因,您确实想要一个更大的堆栈,请查阅编译器文档以获取适当的标志:

您可能需要考虑:


在我们开始猜测如何取消限制之前,您需要准确指定您遇到的限制。为什么100k对象会导致内存不足?每个物体有多大?您是否正处于一个32位进程中,其地址空间而不是内存是极限?@preducer:当程序“耗尽”时,它使用了多少内存?您有多少内存/交换?程序是32位还是64位?10kb的100k对象仍然只有1gig。你的限额是多少?你有多少公羊?这些物体有多大?我是系统管理员。但问题是,我真的不想在linux上使用ulimit命令对其进行全局更改。有什么方法可以从代码中执行此操作吗?您只能在单个外壳内使用
ulimit
命令,即在单个终端内。您可以通过不低于限制的外壳启动。但是没有userland API可以绕过它(如果任何不想受到限制的应用程序都可以“选择退出”,那就有点没用了)。@Adam:有一个userland API--
setrlimit(2)
。ulimit命令基本上只是setrlimit的一个微不足道的包装器。当然,如果您没有权限,您可能会得到EPERM错误。@chrisddah,我的错误。尽管我的主要观点是——非特权进程不能向上更改其硬限制。这不是内存泄漏。我必须为一个类分配大约100000个实例,因此我的内存不足。然后,解决方案是要么购买更多的RAM(现在很便宜),要么减少实例数量,或者减小每个实例的大小。