【问题标题】:C++ HEAP error when delete [] is called调用 delete [] 时出现 C++ HEAP 错误
【发布时间】:2012-04-06 10:38:03
【问题描述】:

我不断收到 VS 2100 中的错误“CRT 检测到应用程序在堆缓冲区启动之前写入内存”

有人可以帮忙吗?我的 int Main 一直在底部。在 operator= 函数上运行delete [] 命令时出现错误

#include "intset.h"
const int MAXINITIALSIZE = 5;
int IntSet::numOfArray = 0;

IntSet::IntSet(int a, int b, int c, int d, int e)
{
    numOfArray++;
    int tempArray[] = {a, b, c, d, e};
    size = determineHighest(tempArray) + 1; //determines largest int
    cout << "size is " << size << endl;

    arrayPtr = new bool[size]; //creates array of bool

    for (int i = 0; i < size; i++) //fill bool array 
    {
        arrayPtr[i]= false;  //arrayptr is a bool pointer created in the header
    }   

    for (int i = 0; i < MAXINITIALSIZE; i++)
    {
        arrayPtr[tempArray[i]]= true;
    }

        for (int i = 0; i < size; i++)
    {
        cout << &arrayPtr[i] << endl;
    }
}
IntSet::IntSet(const IntSet &intsetObject)
{
    numOfArray++;
    size = intsetObject.size;

    arrayPtr = new bool[size];

    for (int i = 0; i < size; i++)
    {
        if (intsetObject.arrayPtr[i])
            arrayPtr[i] = intsetObject.arrayPtr[i];
    }
}
IntSet::~IntSet()
{
    --numOfArray;
    delete [] arrayPtr;     
    arrayPtr = NULL;
}

int IntSet::determineHighest(int tempArray[])
{
    int temp = tempArray[0];    
    for (int i = 1; i < MAXINITIALSIZE; i++)
    {
        if (tempArray[i] > temp)
            temp = tempArray[i];
        else
            continue;       
    }
    return temp;
}

IntSet& IntSet::operator=(const IntSet &intsetObject) //ask about IntSet&
{
    cout << "inside operator=" << endl;
    if (&intsetObject != this)
    {
        for (int i = 0; i < size; i++)
        {
            cout << &arrayPtr[i] << endl;
        }
        delete [] arrayPtr;   //HEAP ERROR HERE!
        for (int i = 0; i < size; i++)
        {
            cout << &arrayPtr[i] << endl;
        }
        size = intsetObject.size
        arrayPtr = new bool[size]();
        for (int i = 0; i < size; i++)
        {
            if (intsetObject.arrayPtr[i])
                arrayPtr[i] = intsetObject.arrayPtr[i];
        }
    }
    return *this;
}
ostream& operator<<(ostream &output, const IntSet &intsetObject)
{
    output << "{ ";
    for (int i = 0; i < intsetObject.size; i++)
    {
        if (intsetObject.arrayPtr[i] == true)
        {
            output << i << " ";
        }
        else 
            continue;
    }
    output << "}";
    return output;
}


//main

#include "intset.h"

int main() {

    IntSet object2(9);   

    IntSet object4(3,6);

    object4 = object2;

   return 0;
}

【问题讨论】:

  • 请将您的问题简化为最小的、独立的、有代表性的测试用例。没有人愿意筛选整个真实的程序。帮助我们帮助您。
  • 另外,你为什么使用普通的、旧的 C 数组而不是 std::vector
  • 你确定那行是错误发生的地方吗?再往下两行似乎更有可能。
  • 您没有将 a,b,c,d,e 的默认值设置为 -1,对吗?
  • 为什么复制构造函数的代码与 operator= 的代码不同?

标签: c++ arrays heap-memory delete-operator


【解决方案1】:

只有在使用负索引访问 arrayPtr 时才会发生这种情况。我怀疑您在IntSet::IntSet 的声明中对a、b、c、d、e 的默认值是-1,因此它在set-true 循环中写入arrayPtr[-1]。在那里检查tempArray[i] &gt;= 0

此外,删除数组后无法打印,因此您应该在删除后删除这些行,尽管它们应该是“无害的”,因为只会打印垃圾,但谁知道 - 操作系统可以释放包含数组的页面,它可能会导致您的程序出现段错误。

最后,您不应该在 copy & = 运算符中测试 if (intsetObject.arrayPtr[i])。否则,源数组中的所有“假”元素在目标数组中都未初始化(new bool[size] 不会将数组初始化为所有 false)。

【讨论】:

  • 谢谢大家,我确实有一个标题,它为默认构造函数引入了 -1 int。但这将创建一个大小为 [-1 + 1 = 0] 的数组。我猜那在 C++ 中不行吗?
  • 谢谢大家,这是头文件中的 (-1, -1, -1, -1, -1) 参数。我暂时修好了。希望这不会再次弹出
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多