我一直在思考,虽然我理解std::observer_ptr的目标,但我认为如果有一个类似的指针类型知道它所指向的对象是否已被删除,那将是很好的。例如,我们可以有以下内容:
slightly_smart_ptr<Foo> p1(new Foo());
auto p2 = p1;
p1.erase(); // This deletes the foo referred to by p1.
if (p2.expired())
std::cout << "p2 is expired\n"; // this will fire
当前标准库中实现此功能的一种方法是,在某个 A 的生命周期将存在的作用域中创建指向 A 的 shared_ptr,始终通过传递 weak_ptr 引用 A,并在不再需要 A 时通过重置 shared_ptr 来删除 A。这里的 weak_ptr 具有 observer_ptrs 的基本语义,知道 A 是否已被删除。但是,这种方法存在问题:必须锁定 weak_ptr,将其转换为 shared_ptr 以便使用,这感觉很不整洁,而且更严重的是,需要在某处存在指向 A 的 shared_ptr,当用户只想要一个稍微智能一些的指针时,该指针并不拥有任何内容。用户同意在适当的时候手动销毁内容:不存在共享所有权,因此在这种情况下创建 shared_ptr 是一种代码异味。
我无法想到隐藏此实现细节的有效方法。
另外,是否存在此类指针的提案或者在 boost 库或其他地方?
shared_ptr
和weak_ptr
并没有问题。无论你如何设计,都需要对对象进行锁定,以防止一个指针在另一个指针使用它时删除它。 - superif(ptr.valid()) { stuff(); ptr->a; }
。stuff()
函数可能使指针无效,所以你必须在每个语句之前进行检查。 - Guillaume Racicot