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
必须有一个简单的自定义删除器,否则它会破坏堆栈以指向自动变量.