类对象可以容纳多大的值?如何确定堆栈/堆限制?

时间:2010-11-05 14:11:58

标签: c++ memory new-operator limit

我有一个需要大量内存的课程。

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!

如何确定内存限制?或者我应该更好地总是使用“新”?

6 个答案:

答案 0 :(得分:3)

首先,因为你有权使用这个C ++而不是C为什么要使用数组?相反,我可以建议vector<double>,或者,如果连续的内存导致问题deque<double>,它会放松对连续内存的约束,而不会删除几乎恒定的时间查找。

使用vectordeque也可以缓解可能在以后困扰您的项目的其他seg故障问题。例如,超出数组中的边界。如果转换为使用vectordeque,则可以使用.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检查堆栈大小。具有自动存储持续时间的变量将在堆栈上分配其空间。正如其他人所说,有更好的方法来解决这个问题:

  1. 使用std::vector将数据保存在BigClass
  2. bf1的构造函数中为BigClass分配内存,然后在析构函数中释放它。
  3. 如果您必须拥有一个大double[]成员,请使用某种smart pointer分配BigClass实例;如果你不需要共享访问,就像std::auto_ptr这样简单的东西可以让你安全地构造/销毁你的对象:

    std::auto_ptr<BigClass>(new BigClass) myBigClass;
    myBigClass->bf1; // your array
    
相关问题