当在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;
}
答案 0 :(得分:2)
在函数cull
中,创建的数组array
的大小为0(调用intEls
时new unsigned [intEls]
为0。)
array[intEls++]
已经不正确,分配给new[]
的数组无法调整大小。它们不会引起错误,因为C ++不会对数组进行自动边界检查(会导致开销)。这是未定义的行为,这意味着它可能以任何方式失败。
该程序的一个解决方法是只使用new unsigned[els]
分配数组。
更好的方法是使用std::vector<unsigned>
而不是原始数组。
答案 1 :(得分:1)
您正在分配大小为零的数组。然后,您正在将数据写入该内存,这是未定义的行为。
intEls = 0;
unsigned * array = new unsigned[intEls];
// ^^^^^^ this should be els