使用智能指针进行内存释放

时间:2012-07-18 07:10:40

标签: c++

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

我试图在下面使用智能指针:

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

一旦f()超出范围,分配给p_someClass的内存就会被释放。 但是,如果getSomeclass()不分配新内存但只返回“单例”指针(而p_Helper也是单例)怎么办?然后下一次调用p_Helper-&gt; getSomeclass()将遇到麻烦。

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

5 个答案:

答案 0 :(得分:3)

帮助程序类的文档说什么?那就是 终极问题。没有返回指针或引用 指定它的生命周期:如果它是指向内部的东西的指针 class,它可能是类对象的生命周期,但它也可以 有静态生命周期(直到程序结束 - 这是 将字符串文字返回为char const*)的函数的大小写 可能有一些较短的生命周期(例如,返回的引用 标准库容器的operator[]或者帮助器可能 希望你删除它。然而,后者应该是罕见的,纯粹的 C ++;在这种情况下的惯例是返回std::auto_ptr(或 std::unique_ptr如果你有一个非常现代的编译器)。 (在C中,它是 经常记录返回的指针必须被释放 调用返回它的库中的特定函数。没有 析构函数,你必须做一些事情来重新获得控制权。)

由于缺乏文档,我很想说库是 不可用。仍然......假设它指向内部和 这个班的一生可能是最合理的猜测; 这是程序员最容易忘记记录的情况。 删除它,或将其放入一个将删除它的智能指针,是 可能不是一个好主意:关于所有权问题的说法已经足够了 类作者似乎不太可能无法记录 事实上,如果你应该删除它。 (但请注意, 即使您不应该删除它,终身问题仍然存在。)

答案 1 :(得分:2)

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

单身人士通常没有公共析构,因此在这种情况下不会编译。

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

如果您设计 p_Helper,那么让 it 返回智能指针,而不是裸指针。如果该方法为每个调用创建了一个新资源,我建议unique_ptr,请查看此处:Differences between unique_ptr and shared_ptr

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您可以快速测试并比较两次调用返回的指针p_Helper-&gt; getSomeclass();

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

如果两个指针都相等,则很可能会得到一个指针(可能是可选的)。

HTH 托