back()内存双倍空闲

可能重复:
什么是三项规则?

在下面的程序中,我有一个双重释放内存的问题。

调试器显示问题出在push_back()函数中。

A类:

class A {
    public:
        A(int x);
        int x;
};

A::A(int x) {
    this->x = x;
}

B类:

class B {
    public:
        B(int x);
        ~B();
        A* a;
};

B::B(int x) {
    this->a = new A(x);
}

B::~B() {
    delete a;
}

主功能:

int main() {
    vector<B> vec;

    for(int i = 0; i < 10; i++) {
        vec.push_back(B(i)); <------------ Issue is here
    }

    cout << "adding complete" << endl;

    for(int i = 0; i < 10; i++) {
        cout << "x = " << (vec[i].a)->x << endl;
    }

    return 0;
}

这段代码有什么问题?

编辑:错误double free or memory corruption


听从三条规则

其他人已经对此感到厌烦,所以我不会进一步下潜。

为了解决您显然要完成的使用(并且在排除过程中遵守三项规则),请尝试以下操作。 虽然每个人都对动态会员的所有权进行适当管理是绝对正确的,但您可以轻松制定具体样本以避免完全使用。

A类

class A {
    public:
        A(int x);
        int x;
};

A::A(int x) 
   : x(x)
{
}

B类

class B {
    public:
        B(int x);
        A a;
};

B::B(int x) 
    : a(x) 
{
}

主程序

int main() {
    vector<B> vec;

    for(int i = 0; i < 10; i++) {
        vec.push_back(B(i));
    }

    cout << "adding complete" << endl;

    for(int i = 0; i < 10; i++) {
        cout << "x = " << vec[i].a.x << endl;
    }

    return 0;
}

底线不要使用动态分配,除非你有充分的理由, 而且它被包含的变量(如智能指针或强力实践三项规则的类)进行生命守护。


你忘了定义一个拷贝构造函数和拷贝赋值操作符,所以你的包装对象被一些B delete ......然后当B一些拷贝超出范围时再次delete

在这种情况下, B(i)就是您已识别的行中的临时数据,以及向量中的实现定义数量的副本。

遵守三条规则。


代码中的问题是由于“简单的”C / C ++指针没有所有权概念。 当指针被复制时,两个副本*“认为”他们拥有数据,导致双重删除。

鉴于这一事实,C ++标准库的设计者引入了unique_ptr<T>类,以帮助您解决这样的问题。


*指针的一个副本在B的实例中传递给push_back ; 指针的另一个副本在输入到vector中的实例中。

链接地址: http://www.djcxy.com/p/73173.html

上一篇: back() memory double free

下一篇: std::pair and class destructors