C ++内存分配错误

时间:2014-01-01 17:27:25

标签: c++ visual-c++

我在c ++中遇到内存分配问题。这是我的代码。

#include <iostream>

using namespace std;

class Animal
{
public:
    Animal(void)
    {

    }

    Animal(int weight):itsWeight(weight)
    {

    }

    ~Animal(void)
    {

    }

    int GetWeight()
    {
        return itsWeight;
    }

    void Display()
    {
        cout << "Weight: " << itsWeight<< endl;
    }
private:
    int itsWeight;
};

class ArrayTemplate
{
public:
    ArrayTemplate(int size)
    {
        animals = new Animal[size];
        index = 0;
    }

    //copy constructor
    ArrayTemplate(const ArrayTemplate &other)
    {

    }

    ~ArrayTemplate(void)
    {
        //if I delete this animals pointer, I got problem.
        delete animals;
    }

    ArrayTemplate operator [] (const Animal &rAnimal)
    {
        animals[index] = rAnimal;
        index++;
        return *this;
    }

    void Display()
    {
        for (int i=0; i<index; i++)
        {
            animals[i].Display();
        }
    }
private:
    //current index.
    int index;
    Animal * animals;
};

int main(int argc, const char * argv[])
{

    ArrayTemplate temp(2);
    Animal animal1(20);
    Animal animal2(30);
    temp[animal1];
    temp[animal2];
    temp.Display();
}

如果我删除了* animals指针,我就会收到此错误。

cpp_mock_question1(19849,0x7fff7c3be310)malloc: *对象0x7fff5fbff8c0的错误:未释放指针被释放 * 在malloc_error_break中设置断点以进行调试

2 个答案:

答案 0 :(得分:4)

如果您使用new[]分配内容,则应使用相应的delete[]取消分配:

delete[] animals;

答案 1 :(得分:0)

由于某种原因,

ArrayTemplate::operator[]按值返回,从而导致复制。而你的拷贝构造函数是空的,所以你最终得到了双重释放。

您应该在复制构造函数中编写深层复制代码,并始终通过引用返回*this

您还需要使用delete[],而不是delete