2

这个问题中,OP 探讨了返回动态创建对象的引用的函数的想法。

intArray& createArray()
{
    intArray *arr = new intArray(10000, 0);
    return(*arr);
}

答案是即使这样可以编译,它也会让使用该函数的程序员感到困惑。他会感到困惑,因为预计当函数返回引用时,该引用的“用户”不负责其内存管理。

我注意到有很多返回指针的 API 方法。这是否意味着一旦不再需要它们,我负责清除(删除对象并将指针设置为 NULL)它们?

4

4 回答 4

2

这是否意味着一旦不再需要它们,我有责任清除 [...] 它们?

经常,但并非总是如此。可以肯定的是,您需要检查您正在使用的特定 API 的文档。

在您自己的 API 中,您应该优先使用智能指针而不是原始指针。这使意图清晰并简化了许多内存管理问题。

于 2013-10-29T10:14:10.297 回答
1

指针本身没有所有权的含义,并且指针通常用于引用它们不应该拥有的对象。如果您想通过处理指针来管理资源,那么您需要记录哪些指针应该拥有它们。然后你只需要希望用户阅读并遵循文档,并且未来的维护者不要让代码和文档分开。

要显式声明和强制执行所有权,请返回智能指针或容器。这些具有使用RAII来解决异常安全问题的好处,否则这些问题几乎是不可避免的。在这种情况下,因为您要返回一个动态数组,std::vector<int>或者std::unique_ptr<int[]>是最合适的。

于 2013-10-29T10:29:53.423 回答
1

通常不会,但这取决于。通常,工厂函数 返回您必须删除的指针(但也有例外);其他函数将返回您不应该删除的指针。

一种约定是返回应该删除的指针的函数应该返回std::auto_ptr(或 std::unique_ptr在 C++11 中)。有一次,这是强烈推荐的,但似乎并没有被广泛采用。

除了这些约定之外,您通常还必须阅读库文档。

于 2013-10-29T10:21:00.230 回答
0

这取决于 API。请参阅文档。

C strdup 函数返回一个指针,您在使用它时应该释放它(API 为您分配它) C strcpy 函数返回一个它没有分配的指针。

于 2013-10-29T10:15:09.963 回答