【发布时间】:2018-03-22 04:40:58
【问题描述】:
场景:
我正在使用旧 C++ 库中的方法,该方法返回指向 SomeClass 的原始指针,其中 SomeClass 是从库头中导出的类,例如 SomeClass.h
以下是我正在使用的LibraryMethod 的签名:
SomeClass* LibraryMethod();
我无权更改库。我只使用二进制和公共标头,这是一个典型的场景。
我不想在我的部分代码中使用原始指针。因此,我在使用库 API 的代码部分中有一个 shared pointer 到 SomeClass。
std::shared_ptr<SomeClass> some_class;
我这样初始化是为了避免存储指向SomeClass的原始指针
some_class = (std::shared_ptr<SomeClass>)LibraryMethod();
这基本上可以,但我想了解这里的细节
问题:
以上是正确的技术吗?
我是不是在这里造成了泄漏?
有没有更好的技术来处理这种情况?
【问题讨论】:
-
你不应该混合不同版本的编译器编译的C++代码。这样做可能会导致难以发现异常。
-
您确定需要
shared_ptr<>而不是unique_ptr<>? -
“第二个所有者”是什么意思,您是否拥有它,如果您拥有,您可以使用
unique_ptr或shared_ptr,如果您不拥有,则不能使用任何一个. -
您的问题遗漏了最重要的信息:谁清理了指针?楼主可以简单
delete ptr;吗?他们必须调用库中的FreePtr函数吗?图书馆是否以某种方式神奇地管理远处的指针?我们看到库提供了指针,但谁拥有它?方便阅读:stackoverflow.com/questions/94227/… -
小心打那个电话。如果您没有考虑@CoryKramer 的回答,
some_class = (std::shared_ptr<SomeClass>)LibraryMethod();可能会按照您刚刚报告的内容炸毁一些东西。您是否有任何库文档可以参考以确定指针的所有权和处理方式?