它是否存在:智能指针,由一个允许访问的对象拥有

时间:2011-01-15 03:28:38

标签: c++ smart-pointers

我想知道是否有人遇到过满足这种需要的任何事情。

对象A包含一个对象B.它希望通过一个指针向客户端提供对该B的访问(可能它的选项可能是0,或者客户端需要可以复制并且还可以保存引用......无论如何) 。客户端,让我们称之为对象C,通常,如果我们是完美的开发人员,请仔细编写,以免违反他们可能拥有的任何指针B的生命语义......但我们并不完美,事实上我们一半时间都很蠢。

所以我们想要的是对象C有一个指向对象B的指针,该对象不是“共享”所有权,但它足够聪明,可以识别指针不再有效的情况,例如当对象A被销毁时或者它会销毁对象B.当它不再有效时访问该指针会导致断言/异常/无论如何。

换句话说,我希望以安全,清晰的方式共享对数据的访问,但保留原始所有权语义。目前,因为我无法找到其中一个对象拥有它的任何共享指针,所以我一直在使用shared_ptr代替这样的东西。但是我想要明确的所有权,共享/弱指针并没有真正提供这一点。

如果这个智能指针可以附加到成员变量而不仅仅是保存指向动态分配的内存区域的指针,那将会更好。

如果它不存在我会去制作它,所以我首先要知道某人是否已经发布了一些可以实现它的东西。

而且,BTW,我确实意识到像引用和指针之类的东西确实提供了这种东西......我正在寻找更聪明的东西。

2 个答案:

答案 0 :(得分:1)

boost::weak_ptr正是您要找的。也许还有一些小的调整,比如禁止从中创建shared_ptr。此外,这可以保存任何内容,包括指向未动态分配的内存的指针。

答案 1 :(得分:0)

您想要的语义类似于Qt的QPointer。这是一个指针,可以在删除相应的QObject时保留QObject s并使其自身为空(通常,例如operator delete)。

然而,类似的方法存在固有的问题 - 这样客户端无法确定他没有使用悬空指针。例如

QPointer<T> smart_ptr = original_obj;
T* tmp = smart_ptr; // this might be a function argument etc.

... // later
delete original_obj;

... // even later
tmp->do_something(); // CRASH

使用一些不允许删除对象的“硬”引用可以避免这种情况,这正是shared_ptr / weak_ptr所做的。

BTW,AFAIK,shared_ptr可以指向成员变量,但它无法管理它们。也就是说,您必须提供不执行任何操作的自定义删除工具。