【发布时间】:2014-07-25 19:41:57
【问题描述】:
我试图让一个类包含一个指针,它可能是一个拥有的指针或一个借用的指针。在前一种情况下,它应该销毁拥有的对象本身;在后一种情况下,它不应该破坏指向的对象。
在代码中,我有 A、B 和 C 类。我的目标是以下(简化的)定义,其中 B 是需要拥有指针的类:
class C {
...
};
class B {
C *c;
B(C *c) : c(c) {
}
};
class A {
C c1;
B b1, b2;
// b2 leaks pointer to C
A() : b1(&c1), b2(new C()) {
}
};
当A 的实例解构时,它会销毁c1、b1 和b2。理想情况下,b2 的销毁应该删除匿名的C 实例,但b1 的销毁不应该删除任何东西(因为c1 会被A 直接销毁)。
我可以使用哪种智能指针来实现这一点?或者,最好的解决方案是将所有权标志传递给 B?
【问题讨论】:
-
这听起来像是一场噩梦。您如何解释这种“可选所有权”?指针是您独有的,还是您与他人共享?线程安全吗?重入?还是你的全部?
-
std::shared_ptr甚至允许这些恶作剧。但是,如果它与默认删除器不同,您必须手动设置正确的删除器,例如空删除器。或者,使用指向拥有对象的shared_ptr以获得完全正确的语义。 -
@Deduplicator 删除器是一个模板参数,因此您必须编写一个处理这两种情况的删除器。您不能只在一种情况下传递空删除器,而在另一种情况下传递常规删除器。
-
回答这个问题,“将所有权标志传递给 B 是最好的解决方案吗?”。是的。
-
@Adam:决定如何构造
shared_ptr与传递所有权标志相同。按照我的第二种方式构建它会更好。
标签: c++ smart-pointers