在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