c++ - STL vector push_back() 内存双释放

标签 c++ stl vector push-back

<分区>

Possible Duplicate:
What is The Rule of Three?

我在下面的程序中遇到了双重释放内存的问题。

调试器显示问题出在 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

最佳答案

您忘记定义复制构造函数和复制赋值运算符,因此您的包装对象正在被一些 B 删除... B 超出范围。

在这种情况下,它是您确定的行上的 B(i) 临时值,以及 vector 中实现定义的拷贝数。

遵守rule of three .

关于c++ - STL vector push_back() 内存双释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347193/

相关文章:

c++ - 参数包的模板推导和显式提供的类型

c++ - 就地 C++ 设置交集

c++ - 将结构作为多映射中的键传递时出错

c++ - 使用vector引发 'std::out_of_range'错误实例后调用终止

c++ - 在 C++ 中将 vector.size() 与 string.length() 相乘的意外答案

c# - 两个向量 2D 之间的角度

c++ - 我可以为迭代器赋值吗?

c++ - 在 x86 上的 c/c++ 中将 16.16 定点转换为 32 位 float 的最快方法?

c++ - 如何使用 C/C++ 映射 Modbus 寄存器地址

c++ - 尝试在 hash_map 中查找记录时应用程序崩溃