我有一个需要大量内存的课程。
class BigClass {
public:
BigClass() {
bf1[96000000-1] = 1;
}
double bf1[96000000];
};
我只能通过堆内存中的“new”对象启动类。
BigClass *c = new BigClass();
assert( c->bf1[96000000-1] == 1 );
delete c;
如果我在没有“新”的情况下发起它。我将在运行时遇到分段错误。
BigClass c; // SIGSEGV!
如何确定内存限制?或者我应该更好地总是使用“新”?
答案 0 :(得分:3)
首先,因为你有权使用这个C ++而不是C为什么要使用数组?相反,我可以建议vector<double>
,或者,如果连续的内存导致问题deque<double>
,它会放松对连续内存的约束,而不会删除几乎恒定的时间查找。
使用vector
或deque
也可以缓解可能在以后困扰您的项目的其他seg故障问题。例如,超出数组中的边界。如果转换为使用vector
或deque
,则可以使用.at(x)
成员函数检索和设置集合中的值。如果你试图写出界限,该函数将引发错误。
答案 1 :(得分:2)
堆栈的大小固定,取决于编译器选项。请参阅编译器文档以更改可执行文件的堆栈大小。
无论如何,对于大对象,更喜欢使用新的或更好的:智能指针,如shared_pointer(来自boost或来自std :: tr1或std ::如果你有最新的编译器)。
答案 2 :(得分:1)
没有与平台无关的方法来确定内存限制。对于“大量”内存,你在堆上分配更安全(即使用new
);您可以通过将结果指针与NULL
进行比较,或捕获std::bad_alloc
例外来检查是否成功。
答案 3 :(得分:1)
你不应该玩那种游戏。您的代码可以从另一个函数或具有较低堆栈大小限制的线程调用,然后您的代码将被破坏。请参阅this closely related question。
如果您有疑问,请使用堆分配(new
) - 直接使用智能指针(如auto_ptr
)或间接使用std::vector
。
答案 4 :(得分:1)
正如您所发现的,您的课程设计方式非常脆弱。而不是总是在堆上分配您的对象,而是您的类本身应该在堆上分配巨大的内存块,最好是std::vector
,或者shared_ptr
如果vector
没有{{1}}因某种原因工作。然后你不必担心你的客户如何使用这个对象,放在堆栈或堆上是安全的。
答案 5 :(得分:0)
在Linux上,在Bash shell中,您可以使用ulimit -s
检查堆栈大小。具有自动存储持续时间的变量将在堆栈上分配其空间。正如其他人所说,有更好的方法来解决这个问题:
std::vector
将数据保存在BigClass
。bf1
的构造函数中为BigClass
分配内存,然后在析构函数中释放它。如果您必须拥有一个大double[]
成员,请使用某种smart pointer分配BigClass实例;如果你不需要共享访问,就像std::auto_ptr
这样简单的东西可以让你安全地构造/销毁你的对象:
std::auto_ptr<BigClass>(new BigClass) myBigClass;
myBigClass->bf1; // your array