【发布时间】:2013-09-13 23:47:25
【问题描述】:
让我们假设以下情况。我有一个如下定义的隐式共享类:
class MyClass
{
public:
MyClass (void) {
data = new Data();
data->refs = 1;
data->dummy = 32;
}
~MyClass (void) {
if (--data->refs == 0)
delete data;
}
MyClass (const MyClass& c) {
++(data = c.data)->refs;
}
MyClass& operator = (const MyClass& c) {
++(data = c.data)->refs;
return *this;
}
private:
struct Data {
int refs;
int dummy;
} *data;
};
这个想法是,当这个类被复制时,指向数据的内部指针被复制,并且对该数据的引用数量增加。但是,请考虑以下事项:
int main (void)
{
MyClass c1;
c1 = MyClass();
c1 = MyClass();
return 0;
}
我的理解是 MyClass 有三个实例,只有最后一个实例被释放。如果是这种情况,我可以做些什么来避免这些情况并确保 MyClass 的每个实例都得到清理?
【问题讨论】:
-
你考虑过
std::shared_ptr吗? -
关注Rule of Three,你会没事的。
-
您根本没有做的一件事是防止自我覆盖。好吧,你是,但这只是因为你的赋值运算符完全坏了。在假设使用 rhs 引用之前,它实际上是放弃了您先前构建的数据块。换句话说,这在分配时泄漏。使用
std::shared_ptr<>。它是为这样的事情而设计的。 -
MyClass 的所有三个实例都被释放——它们都在堆栈上,C++ 编译器自动处理堆栈对象的释放。
标签: c++ class implementation