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

Luk*_*pin 1 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

我很抱歉,如果这是重复的,我做了相当多的谷歌搜索,无法找到这个问题的答案.

Bar*_*rry 12

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

template <class T>
using observer_ptr = T*;
Run Code Online (Sandbox Code Playgroud)

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

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