delete[]检测到给定堆损坏



在main中专门调用delete时,我收到了一个检测到堆损坏的错误。但我清楚地看到,我的动态分配数组中的值正在显示。我查阅了其他几篇文章,但我对自己的具体情况感到困惑,因为我做错了什么。动态分配的数组应该包含原始数组中大于或等于10的数组元素。这就是为什么11和13在输出新的动态分配阵列中的阵列元素时显示。感谢所有帮助解决这个问题的人。

#include <iostream>
#include <string>
#include <new>
#include <cmath>
#include <cstdlib>
using namespace std;
bool interesting(unsigned n);
unsigned * cull(unsigned & intEls, const unsigned ar[], unsigned els);
int main(){
unsigned ar1[5] = { 3,5,7,11,13 };
unsigned size;
unsigned * result = cull(size,ar1,5);
for (unsigned i = 0; i < size; i++) {
cout << result[i];
}
delete[] result;
}
bool interesting(unsigned n){
if (n >= 10)
return true;
else {
return false;
}
}
unsigned * cull(unsigned & intEls, const unsigned ar[], unsigned els){
intEls = 0;
unsigned * array = new unsigned[intEls];
for (unsigned i = 0; i < els; i++) {
if (interesting(ar[i])) {
array[intEls++] = ar[i];        
}
}
return array;
}

在函数cull中,创建大小为0的数组array(调用new unsigned [intEls]intEls为0(

array[intEls++]已经不正确,无法调整用new[]分配的数组的大小。它们不会导致错误,因为C++不会对数组进行自动边界检查(会导致开销(。它是未定义的行为,这意味着它可能以任何方式失败。

该程序的一个修复方法是只为数组分配new unsigned[els]

更好的方法是使用std::vector<unsigned>而不是原始数组。

您正在分配一个大小为零的数组。然后将数据写入内存,这是未定义的行为。

intEls = 0;
unsigned * array = new unsigned[intEls];
//                              ^^^^^^  this should be els

最新更新