使用智能指针解除内存分配

Memory deallocation with smart pointer

本文关键字:内存 分配 指针 智能      更新时间:2023-10-16

在C++中,假设Helper类中有一个方法,它会向我返回一个指向另一个对象的指针。除了方法签名和返回对象的类型之外,我没有关于这个方法的更多信息。在这种情况下,如何进行内存管理?

我尝试使用智能指针作为下面的函数:

void f() {
   auto_ptr<SomeClass> p_someClass = p_Helper->getSomeclass();
   p_someClass->doSomething();
}

一旦f()超出作用域,分配给p_someClass的内存就会被释放。但是,如果getSomeclass()不分配新内存,而只是返回一个"singleton"指针(p_Helper也是singleton),该怎么办?那么对p_Helper->getSomeclass()的下一次调用将出现问题。

处理这个问题的常用方法是什么,尤其是当Helper类的文档很少时?

helper类的文档说明了什么?这就是最终问题。没有指针或引用就不能返回指定其生存期:如果它是指向类,它可能是类对象的生存期,但也可能具有静态生存期(直到程序结束—这是返回字符串文字为char const*的函数的情况)可能会缩短使用寿命(例如标准库容器的operator[]),或者助手可能希望您删除它。然而,后者应该很少见,以纯C++这种情况下的惯例是返回CCD_ 3(或std::unique_ptr,如果你有一个非常现代的编译器)。(在C中频繁地记录返回的指针必须由调用返回该函数的库中的特定函数析构函数,你必须做些什么才能在最后重新获得控制权。)

在没有文件的情况下,我很想说图书馆无法使用。还假设它指向某种内在的东西拥有终身制的班级可能是最合理的猜测;这是程序员最容易忘记记录的情况。删除它,或者将它放在将删除它的智能指针中,就是可能不是一个好主意:关于所有权问题已经说得够多了类作者似乎不太可能不记录事实上,如果你应该删除它即使您不应该删除它,生存期问题仍然存在。)

如果您不是p_Helper类的作者,首先:

Singleton通常没有公共析构函数,所以在这种情况下,它不会编译。

其次,如果你"只得到"一个没有任何进一步信息的空指针,就无法知道你是否可以删除它需要在文档中提供该信息,以便您使用函数/方法。

如果正在设计p_Helper,那么让it返回智能指针,而不是空指针。如果该方法为每个调用创建一个新的资源,我建议unique_ptr,请查看此处:unique_ptr和shared_ptr 之间的差异

这种情况的典型方法是使用引用计数和像shared_ptr这样的智能指针,它通常会处理所有合理的情况。

在这种情况下,您可以使用原始指针。

void f() {
   SomeClass *p_someClass = p_Helper->getSomeclass();
   p_someClass->doSomething();
}

您可以做一个快速测试,比较两次调用p_Helper->getSomeclass()返回的指针;

bool do_not_delete =  p_Helper->getSomeclass() ==  p_Helper->getSomeclass();

如果两个指针相等,那么您可能会得到一个指针,它是一个(可能是可选的)引用。

hthTorsten