赋值运算符中的内存泄漏

时间:2014-03-21 16:09:55

标签: c++ memory-leaks operator-keyword

在我的程序中,我必须重载=运算符。重载函数如下所示:

Polygon &Polygon::operator=(const Polygon &source)
{
    this->capacity = source.capacity;
    this->index = source.index;
    this->vertex = new Vertex[source.capacity];

    for(int i = 0; i < source.capacity; i++)
    {
        this->vertex[i] = source.vertex[i];
    }

    return *this;
}

但是,如果我学到的一件事是我负责删除我用&#34; new&#34;关键字。

所以在回来之前我试过:

delete vertex;

但是,由于它删除了我刚刚复制到的对象,因此无法正常工作。 所以我尝试了:

delete source.vertex;

在运行期间,我的程序崩溃了。

我也尝试了很多其他的方法,但他们只是在思考背后。 我真的很想得到你的帮助,不仅要给我我应该写的东西,还要在这些场景中思考。

3 个答案:

答案 0 :(得分:4)

在此声明之前

this->vertex = new Vertex[source.capacity];

插入声明

delete [] this->vertex;

此外,运营商必须采用以下方式

Polygon &Polygon::operator=(const Polygon &source)
{
    if ( this != &source )
    {
       this->capacity = source.capacity;
       //...
    }

    return *this;
}

答案 1 :(得分:2)

该程序可能已崩溃,因为您使用delete删除了使用operator new[](而不是operator new)创建的指针。这是两件不同的事情。您始终必须使用delete[]new[]匹配这两者:

int *p = new int;
delete p;

int *q = new int[10];
delete [] q;

答案 2 :(得分:1)

您无法删除那里的顶点,因为该对象仍在引用它。 Polygon的析构函数应该负责删除它创建的Vertex个对象:

~Polygon::Polygon()
{
    if (vertex)
        delete[] vertex;
}