没有所有权的堆栈对象的指针

Hum*_*awi 12 c++ pointers smart-pointers c++11

我想要一个带有指针成员变量的类.该指针应指向可以堆栈分配或堆分配的对象.但是,此指针不应具有任何所有权.换句话说,当指针超出范围时,根本不应该调用delete.我认为原始指针可以解决问题...但是,我不确定是否有比原始指针更好的C++ 11方法?

例:

class foo{
public:
    bar* pntr
};

int main(){
    bar a;
    foo b;
    b.pntr=&a;
}
Run Code Online (Sandbox Code Playgroud)

vso*_*tco 19

原始指针在这里完全没问题.C++ 11没有任何其他"哑"智能指针处理非拥有对象,所以你不能使用C++ 11智能指针.有一个针对非自有对象的"愚蠢"智能指针的提议:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf

已经通过实验实现std::experimental::observer_ptr(感谢@TC提示).

另一种方法是使用智能指针和自定义删除器,它不执行任何操作:

#include <memory>

int main()
{
    int a{42};

    auto no_op = [](int*){};
    std::unique_ptr<int, decltype(no_op)> up(&a, no_op);
}
Run Code Online (Sandbox Code Playgroud)

或者,正如@TC在评论中提到的那样std::reference_wrapper.

正如Orbit中的@Lightness Races所提到的,a std::weak_ptr也可能是一种解决方案,因为后者也是非拥有的智能指针.但是,a std::weak_ptr只能由一个std::shared_ptr或另一个构成std::weak_ptr.一个严重的缺点是,这std::shared_ptr是一个"沉重"的对象(因为内部引用计数机制).请注意,即使在这种情况下,std::shared_ptr必须有一个简单的自定义删除器,否则它会破坏堆栈以指向自动变量.

  • 您应该链接到[最新修订版(N4282)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf)或[`std ::实验:: observer_ptr`](http://en.cppreference.com/w/cpp/experimental/observer_ptr).另外,如果指针永远不为null,`reference_wrapper`是一个选项. (3认同)