c++ - 指向没有所有权的堆栈对象的指针

标签 c++ pointers c++11 smart-pointers

我想要一个带有指针成员变量的类。这个指针应该指向一个可能是堆栈分配或堆分配的对象。但是,这个指针不应该有任何所有权。换句话说,当指针超出范围时,根本不应该调用 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/

相关文章:

c++ - this->field 与 C++ 中的 this.field

std::vector<std::array<char, 2>> 的 C++ 数据连续性

c++ - 迭代器的 Range TS 和 C++20 概念是否需要能够使用 `operator->` ?

关于 pow 函数的 C++ 问题

适用于 Windows XP SP1 的 C++11

c++ - 没有堆的 static const std::vector<char> 初始化?

c++ - 如果我们将 "decltype(auto) f()"用作定义中包含 "decltype(f()) result"的函数声明,会发生什么情况?

c++ - 将特定大小的 vector 传递给函数

c - char *s[] 和 char (*s)[] 有什么区别?

c++ - 对象在将其指针转换为基数后未调用好的方法