首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用智能指针安全地包装来自工厂的遗留原始指针?

何时使用智能指针安全地包装来自工厂的遗留原始指针?
EN

Stack Overflow用户
提问于 2022-02-22 16:58:04
回答 1查看 90关注 1票数 0

何时可以安全地装入智能指针(unique_ptr或shared_ptr),C++框架工厂返回的原始指针在c++11之前就开始开发了?

例如,当所有事情都发生在同一个函数中时:

代码语言:javascript
复制
int main(int argc,char** argv)
 {
  //.....
  auto* runManager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);
  //... many lines later
  delete runManager;
 }

它认为将返回的原始指针放入unique_ptr并在函数末尾删除是无害的。

但是,除了这个特定的情况之外,我不确定是否还有其他情况可以安全地完成--而且您的代码在可读性/可维护性方面的提高是值得的。

特别是,我使用的是一个C++框架工具包,它开发了自己的跟踪和处理框架创建的对象的方法,因此在以一种最初不打算使用的方式使用返回的指针之前,我必须三思(或更多)。

任何建议都是非常欢迎的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-22 17:16:47

只有当返回值指向的对象的所有权被传递给用户(即,您编写调用该工厂的代码时)。工厂返回的对象可能实际上属于框架,并且会被正确销毁,并且(几乎)永远不会丢失。使用智能指针将导致问题,主要是双重删除。

Qt框架就是一个例子,在这个框架中,所有可视元素在被销毁时都会销毁它们的子元素,而所有QObject元素都会被“枚举”。那里的工厂对用户是隐藏的,主要与信号槽系统和元对象数据有关.在一些特殊情况下,可以使用智能指针,但Qt提供了自己的风格。

不拥有已创建对象的工厂可能需要一些自定义步骤才能直接删除对象,在这种情况下,您应该为智能指针使用适当的删除器。

对于现代C++中的“原始指针是不好的”这一说法,有一点误解。它实际上必须是“原始拥有指针是不好的”。如果您松散了原始指针的值,而程序中没有任何东西存储它的值,以便正确地分配和释放资源,那么它就是一个拥有指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71225299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档