C++ C+中的堆栈溢出错误+;程序

C++ C+中的堆栈溢出错误+;程序,c++,class,visual-c++,pointers,C++,Class,Visual C++,Pointers,所以我有一个复杂的类,我想要一个二维的复数数组,这是代码的一部分,不是所有的代码 class Complex { public: /* construction/destruction */ Complex(double r, double i) { this->r = r; this->i = i; } Complex() { r=0.0; i=0.0; } ~Complex()

所以我有一个复杂的类,我想要一个二维的复数数组,这是代码的一部分,不是所有的代码

class Complex {
public:
    /* construction/destruction */
    Complex(double r, double i)     { this->r = r; this->i = i; }
    Complex()                       { r=0.0; i=0.0; }
    ~Complex()                      { r=0.0; i=0.0; }
        /* operations */
    Complex operator+(Complex &c)   { return Complex( r+c.r, i+c.i ); }
        double r, i;
};

int main()
{
const int HEIGHT = 256;
const int WIDTH = 256;
Complex G[HEIGHT][WIDTH];
}

所以线的复数G[高度][宽度];是导致问题的行,知道原因吗?

Visual studio默认为1MB堆栈大小,它看起来像:

Complex G[HEIGHT][WIDTH];
将仅为1MB,您可以使用修改此文件,该文件显示(我的重点):

如果没有此选项,堆栈大小默认为1 MB。数字参数可以是十进制或C语言表示法。参数的范围从1到链接器接受的最大堆栈大小。链接器将指定的值舍入到最接近的4字节。/F和数字之间的空格是可选的

最明显的替代方案是通过新的或新的方式使用动态内存分配

据我所知,Visual Studio实际上具有堆栈大小:

platform    default size       
=====================================
SunOS/Solaris  8192K bytes
Linux          8192K bytes
Windows        1024K bytes
cygwin         2048K bytes
Mac OS X       8192K bytes
知道为什么吗

某些编译器将堆栈大小默认为1MB。您正在分配65536个复杂对象,每个对象占用2个*
sizeof(double)
内存。假设
double
为8字节(此信息由实现定义),您实际上是在尝试分配16*65536字节(不考虑可能的填充),即1048576字节,这会导致溢出

另一种方法是使用包装器的动态分配,该包装器模拟二维数组索引,如下所示:

template<std::size_t A, std::size_t B>
class G {
private:
    std::unique_ptr<Complex[]> mem;
public:
    G() : mem(new Complex[A * B]) {}
    Complex& operator()(std::size_t a, std::size_t b) {
        return mem[a * B + b];
    }
    Complex  operator()(std::size_t a, std::size_t b) const {
        return mem[a * B + b];
    }
};

没用。当内存离开作用域时,不要重新初始化将被销毁的内存。

假设是8字节的双字节,那么单是
G
就有1MB的堆栈存储空间,这通常是总体限制。因为堆栈中溢出了65536个
复杂的
对象。这真的不是一个。。。复杂的。。。需要理解的东西。最好不要在堆栈上分配大数组-使用
malloc
-或者创建一个访问函数作为类的一部分,以保持索引的简单。@Floris,s/
malloc
/
vector
/。尝试静态。这将它放入静态数据区,避免浪费宝贵的堆栈。。。与malloc不同,编译器仍然知道它在编译时的位置:)
int main(int, char*[]) {
    G<256, 256> g;
    g(0, 0) = ...;
}
~Complex() { r=0.0; i=0.0; }