当一个函数返回一个指针时,它是否暗示我负责指针内存管理?

时间:2013-10-29 10:10:54

标签: c++ pointers memory-management

this question中,OP探讨了一个函数的概念,该函数返回动态创建的对象的引用。

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

答案是,即使这个面团会编译,也会混淆正在使用该函数的程序员。他会感到困惑,因为当函数返回引用时,预期该引用的“用户”不负责其内存管理。

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

4 个答案:

答案 0 :(得分:2)

  

这是否意味着一旦不再需要我负责清理它们?

通常,但并非总是如此。当然,您需要查看您正在使用的特定API的文档。

在您自己的API中,您应优先考虑原始指针smart pointers。这使得意图清晰并简化了许多内存管理问题。

答案 1 :(得分:1)

通常不是,但这取决于。通常,工厂功能 返回你必须删除的指针(但有 例外情况也是如此);其他功能将返回 你不应该删除的指针。

一个惯例是返回指针的函数 应该删除应该返回std::auto_ptr(或 C ++中的std::unique_ptr 11)。有一次,这是非常高的 推荐,但它似乎没有被广泛采用。

除了这些惯例,你通常必须阅读 图书馆文件。

答案 2 :(得分:1)

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

要显式声明并强制执行所有权,请返回智能指针或容器。这些奖励使用RAII来解决几乎不可避免的异常安全问题。在这种情况下,由于您要返回动态数组,std::vector<int>std::unique_ptr<int[]>最合适。

答案 3 :(得分:0)

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

C strdup函数返回一个指针,你完成它后应该释放它(API为你分配它) C strcpy函数返回一个它没有分配的指针。