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