delete []导致检测到堆损坏

时间:2018-12-10 23:11:51

标签: c++ dynamic-memory-allocation

当在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;
}

2 个答案:

答案 0 :(得分:2)

在函数cull中,创建的数组array的大小为0(调用intElsnew 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