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; }