【发布时间】:2012-04-12 02:32:16
【问题描述】:
在使用托管内存和函数式语言大约 10 年之后,我终于回到了 C++ 领域,而智能指针让我很困惑。有一半的文档仍然是关于已弃用的auto_ptr。
我正在尝试实现这个相当简单的 Bullet "hello world" 程序:
int _tmain(int argc, _TCHAR* argv[])
{
auto bp = unique_ptr<btBroadphaseInterface>(new btDbvtBroadphase);
auto cc = unique_ptr<btDefaultCollisionConfiguration>(new btDefaultCollisionConfiguration);
auto disp = unique_ptr<btDispatcher>(new btCollisionDispatcher(cc));
}
btCollisionDispatcher 构造函数需要一个 btCollisionConfiguration*,但我将其改为 unique_ptr。
在这种情况下,我通常想做什么?如果有一种方法可以“取消智能”指针,就会告诉我unique_ptr 不是正确的智能指针。
在我转向其他事物之前,C++ 是我选择的语言。回来看到所有的模式和做法都完全改变了,这有点令人震惊。
【问题讨论】:
-
我认为答案取决于
btCollisionDispatcher是要分享所有权还是取得所有权?如果是后者 - 你能不能改变它来接受unique_ptr?如果是前者,则必须将其更改为shared_ptr并传递。 -
disp将持有cc并使用它直到它被破坏。它希望您会在其他地方使用它,例如当我稍后调用btWorld构造函数时,但据我所知,它不会在自己的范围之外共享指针。 -
这可能与您的问题无关,但正如您所说,您来自托管语言背景,请确保不要过多地发送垃圾智能指针,并始终首先考虑自动存储。只是一个小而重要的建议,不得不说。
-
"在这种情况下我通常想要做什么?" Read
std::unique_ptr's documentation. -
使用托管语言可以做的最好的事情就是忘记
new!
标签: c++ c++11 smart-pointers