我有一个我正在更新的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中的一个真正的类类型,但基本上只是一个非常薄的原始指针包装器)并传递它.这在概念上或语义上与原始指针不同,我们使所有各方更加清楚,这里没有所有权.只是观察语义.
除此之外,共享堆栈对象的所有权意味着什么?
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |