为太多动态分配的数组赋值时程序崩溃 - C++
Posted
技术标签:
【中文标题】为太多动态分配的数组赋值时程序崩溃 - C++【英文标题】:Program crashes when assigning value to too many dynamically allocated arrays - C++ 【发布时间】:2016-08-07 06:18:38 【问题描述】:我的程序中有大约 +30 个动态分配的数组,每个数组的定义如下:
int Nx = 240;
int Ny = 240;
double* array = new double(Nx*Ny);
我可以将值分配给其中的 16 个,但是一旦达到第 17 个,它就会抛出 seg 错误!
这是抛出它的代码,完全没问题!
for (int i = 0; i < Nx*Ny; i++)
array[i] = 0;
我真的不知道为什么,我想用完堆,但既然我有 4GB 的 RAM,那应该是不可能的! 我正在使用 MSVS15 并在 Windows 10 上运行程序!
知道为什么会这样吗? 确切的错误:
在 ecostress.exe 中的 0x00298389 处引发异常:0xC0000005:访问冲突写入位置 0x01D2B000。 如果有这个异常的处理程序,程序可以安全地继续。
【问题讨论】:
附注如果适合您的应用程序,请考虑使用std::vector
。
您也可以使用memset
将内存归零,这样可能会更快。
@Inline: memset
不保证清零除整数数组之外的任何内容。不能保证“0.”的位表示为全零。
【参考方案1】:
简单的错字:
double* array = new double(Nx*Ny); // creates a single, initialized double
double* array = new double[Nx*Ny]; // creates an array of doubles
【讨论】:
天哪!如果你有任何想法我花了多少天。非常感谢! @sorry_I_不会放轻松:)【参考方案2】:@Hurkyl 回答正确。
我只是想补充一点,如果是在 C++ 上,那么最好使用向量:
vector<int> array(Nx*Ny);
要直接访问指针,您可以使用&array[0]
,尽管通常没有理由这样做,您仍然可以使用array[0] = 0
。
vector
和 stl 的优势通常在于它通过析构函数自动释放内存。
【讨论】:
以上是关于为太多动态分配的数组赋值时程序崩溃 - C++的主要内容,如果未能解决你的问题,请参考以下文章