为太多动态分配的数组赋值时程序崩溃 - 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);

要直接访问指针,您可以使用&amp;array[0],尽管通常没有理由这样做,您仍然可以使用array[0] = 0

vector 和 stl 的优势通常在于它通过析构函数自动释放内存。

【讨论】:

以上是关于为太多动态分配的数组赋值时程序崩溃 - C++的主要内容,如果未能解决你的问题,请参考以下文章

删除动态数组时崩溃

C++ 关于内存泄露问题。内存泄露是指用new 分配的内存没有用delete释放,如果未释放会有啥后果?

二维数组C++的动态分配

C++ 动态内存分配与结构中的数组

在 C++ 中动态调整数组的大小

二维数组动态内存分配崩溃[重复]