将从方法返回的原始指针存储到智能指针中

Gam*_*ads 6 c++ c++11 c++14

情形:
我使用从旧的C++库返回一个原始指针到一个方法SomeClass,其中SomeClass从一个库头一个导出类说SomeClass.h

以下是LibraryMethod我使用的签名:

SomeClass* LibraryMethod();
Run Code Online (Sandbox Code Playgroud)

我没有权限更改库.我只使用二进制和公共标题,这是一个典型的场景.

我不想在我的代码中使用原始指针.因此,我有一个共享指针SomeClass在我使用库API的代码的一部分.

std::shared_ptr<SomeClass> some_class;
Run Code Online (Sandbox Code Playgroud)

我这样初始化,以避免存储原始指针 SomeClass

some_class = (std::shared_ptr<SomeClass>)LibraryMethod();
Run Code Online (Sandbox Code Playgroud)

这基本上有效,但我想在这里了解细节

问题:
以上是正确的技术吗?
我在这里造成泄漏吗?
有没有更好的技术来处理这种情况?

Cor*_*mer 7

你应该把它称为

auto some_class = std::shared_ptr<SomeClass>(LibraryMethod());
Run Code Online (Sandbox Code Playgroud)

这假设LibraryMethod是分配指针并为您提供内存的所有权.

按照目前的编写,您尝试将原始指针强制转换为std::shared_ptr使用C样式转换(可能导致a reinterpret_cast).相反,您希望使用返回的原始指针构造一个std::shared_ptr.

  • 它不只是*看起来*不同,这两个版本实际上*是*不同的.你的方法是做一个C风格的演员,可能无法正常运作.此方法使用原始指针作为参数构造`std :: shared_ptr`. (2认同)