我想要一个带有指针成员变量的类。这个指针应该指向一个可能是堆栈分配或堆分配的对象。但是,这个指针不应该有任何所有权。换句话说,当指针超出范围时,根本不应该调用 delete。我认为原始指针可以解决问题...但是,我不确定是否有比原始指针更好的 C++11 方法?
示例:
class foo{
public:
bar* pntr
};
int main(){
bar a;
foo b;
b.pntr=&a;
}
最佳答案
原始指针在这里非常好。 C++11 没有任何其他处理非拥有对象的“哑”智能指针,因此您不能使用 C++11 智能指针。有一个针对非拥有对象的“愚蠢”智能指针的提议:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf
已经实验性地实现为 std::experimental::observer_ptr
(感谢@T.C. 的提示)。
另一种选择是将智能指针与不执行任何操作的自定义删除器一起使用:
#include <memory>
int main()
{
int a{42};
auto no_op = [](int*){};
std::unique_ptr<int, decltype(no_op)> up(&a, no_op);
}
或者,正如@T.C. 所提到的。在评论中,一个 std::reference_wrapper
.
正如@Lightness Races in Orbit 所述,std::weak_ptr
也可能是一个解决方案,因为后者也是一个非拥有智能指针。但是 std::weak_ptr
只能从 std::shared_ptr
构造。或另一个 std::weak_ptr
。一个严重的缺点是 std::shared_ptr
是一个“重”对象(因为内部引用计数机制)。请注意,即使在这种情况下,std::shared_ptr
也必须有一个简单的自定义删除器,否则它会破坏指向自动变量的指针的堆栈。
关于c++ - 指向没有所有权的堆栈对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568150/