【发布时间】:2012-08-27 01:26:53
【问题描述】:
我最近问了一个与这个问题有点相关的问题,但它的措辞很糟糕,我不知道自己在做什么。我有时间玩代码,希望这个问题更有意义。尽管如此,还是有一些事情出错。我有一个 B 类。指向该类的指针 (*p)。我只想复制这个指针(比如称为 q)。删除 p 但仍然有 q 一个指向 p 所指向的相同信息的有效指针。然后删除q。当我尝试将它们设置为彼此相等时,我遇到了问题
class B
{
public:
B(); ~B();
B(const B &Overloading);
B& B::operator=(const B &Overloading);
vector<*A> stores_a; //class A contains ints, doubles etc. I filled this with
//pointers to class A
void Mr_Clean();
};
B::B() {}
~B::B()
{
Mr_Clean();
}
B::B(const B &Overloading)
{
for(size_t i=0; i<stores_a.size(); i++)
{
stores_A[i]=new A(*Overloading.stores_a[i]);
}
}
B::B& B::operator=(const B &Overloading)
{
if(this!=&Overloading)
{ Mr_Clean();
for(size_t i=0; i<stores_a.size(); i++)
{
stores_A[i]=new A(*Overloading.stores_a[i]);
}
}
return *this
}
void B::Mr_Clean()
{
for(size_t i=0; i<stores_A.size(); i++)
{
delete stores_A[i];
}
}
int main()
{
B *p=new B;
B *q=new B;
// fill some stuff. this is just random stuff I am making up
*q=*p; //compiles then Kaboom at this line
delete p;
delete q;
return 0;
}
我想我在赋值运算符上仍有一些概念上的差距。我已经阅读了很多教程,我觉得我正在做他们所说的......
还有另一个问题,比如说在这个例子中,我在 B 中也有一个成员 int x。既然我调用了复制构造函数并重载了赋值运算符,我是否必须显式调用 x=Overloading.x?我的意思是从技术上讲,我正在覆盖默认的复制构造函数,不是吗?但是 x 只是一个普通的普通旧 int。
【问题讨论】:
-
也许this answer 可以帮助解决一些关于“删除指针”的基本困惑。
-
在您的开头段落中,您似乎混淆了指针和对象。指针是
p,对象本身是*p。 -
发布真实代码,减少到可以编译和运行并显示问题的最低限度。此代码无法编译。
-
对不起,我用错了指针部分。是的 p 是一个指针。 *p 将是它指向的对象。我删除 p 即。它指向的对象,但在我这样做之前,我想制作这个对象的副本,其中 q 将指向这个对象。所以当我删除 p 指向的东西时,q 仍然会指向一个有效的对象
标签: c++ vector operator-overloading copy-constructor delete-operator