何时可以安全地装入智能指针(unique_ptr或shared_ptr),C++框架工厂返回的原始指针在c++11之前就开始开发了?
例如,当所有事情都发生在同一个函数中时:
int main(int argc,char** argv)
{
//.....
auto* runManager = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);
//... many lines later
delete runManager;
}它认为将返回的原始指针放入unique_ptr并在函数末尾删除是无害的。
但是,除了这个特定的情况之外,我不确定是否还有其他情况可以安全地完成--而且您的代码在可读性/可维护性方面的提高是值得的。
特别是,我使用的是一个C++框架工具包,它开发了自己的跟踪和处理框架创建的对象的方法,因此在以一种最初不打算使用的方式使用返回的指针之前,我必须三思(或更多)。
任何建议都是非常欢迎的。
发布于 2022-02-22 17:16:47
只有当返回值指向的对象的所有权被传递给用户(即,您编写调用该工厂的代码时)。工厂返回的对象可能实际上属于框架,并且会被正确销毁,并且(几乎)永远不会丢失。使用智能指针将导致问题,主要是双重删除。
Qt框架就是一个例子,在这个框架中,所有可视元素在被销毁时都会销毁它们的子元素,而所有QObject元素都会被“枚举”。那里的工厂对用户是隐藏的,主要与信号槽系统和元对象数据有关.在一些特殊情况下,可以使用智能指针,但Qt提供了自己的风格。
不拥有已创建对象的工厂可能需要一些自定义步骤才能直接删除对象,在这种情况下,您应该为智能指针使用适当的删除器。
对于现代C++中的“原始指针是不好的”这一说法,有一点误解。它实际上必须是“原始拥有指针是不好的”。如果您松散了原始指针的值,而程序中没有任何东西存储它的值,以便正确地分配和释放资源,那么它就是一个拥有指针。
https://stackoverflow.com/questions/71225299
复制相似问题