我有一个正在更新的 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/