在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类的文档很少时?
答案 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 托