C++14 堆栈分配的共享指针

标签 c++ c++11 c++14

我有一个正在更新的 Pre C++11/14 代码库。

代码几乎难以捉摸地使用堆栈分配,然后传递这些指针,例如:

{
  KlassX x;
  KlassY y;

  y.doThings( &x );  //Holds the pointer to KlassX for later use

  return mainLoop(); //Doesn't return until the program finishes
}

在这种情况下,KlassY 对 *KlassX 的内存分配一无所知。在这个特定的应用程序中,它是安全的,但不是“安全代码”,因为如果以不同的方式使用 KlassY,它不会使用 shared_ptr 来跟踪其持有的指针上的解除分配。

我宁愿实现 KlassY 以使用 shared_ptr,而无需将程序更改为堆分配。有没有一种安全的方法可以让我继续使用堆栈分配方案,但让 KlassY 为 KlassX 使用 shared_ptr?

如果这是重复的,我深表歉意,我进行了大量的谷歌搜索,但找不到这个问题的答案。

最佳答案

这里没有理由使用shared_ptr。你没有分享所有权! doThings() 不拥有 &x 的所有权(它不可能那样做),它只是观察它。传递原始的、可观察的指针并没有错。如果你想在 C++11 中强调这一点,你可以简单地定义:

template <class T>
using observer_ptr = T*;

(这实际上是 library funtamentals TS v2 中的一个真正的类类型,但基本上只是一个非常薄的原始指针包装器)并传递它。这在概念上或语义上与原始指针没有区别,我们让各方更加清楚这里没有没有所有权。只是观察语义。

此外,共享堆栈对象的所有权意味着什么?

关于C++14 堆栈分配的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273852/

相关文章:

c++ - 阅读 c++ 11 的书是否需要具备 c++98 的知识?

c++ - 尝试在多集中插入元素时发生C++ 11编译错误

c++ - clang 如何检测 noexcept-ness?

c++ - 模板实例化深度超过最大值 - 如何停止特定情况?

c++如何优化经常调用的函数?

c++ - 命名空间、类型和头文件中的 using 指令相同的类型被识别为字段和函数返回值类型,但不被识别为参数类型

c++ - 最低的数组值

c++ - 为什么模板编译这么慢?

C++ 11:普通字符串文字和UTF-8字符串文字之间的区别示例?

c++ - 在 std::find 中使用来自不同命名空间的运算符