在this question中,OP探讨了一个函数的概念,该函数返回动态创建的对象的引用。
intArray& createArray()
{
intArray *arr = new intArray(10000, 0);
return(*arr);
}
答案是,即使这个面团会编译,也会混淆正在使用该函数的程序员。他会感到困惑,因为当函数返回引用时,预期该引用的“用户”不负责其内存管理。
我注意到有很多返回指针的API方法。这是否意味着一旦不再需要它,我负责清除(删除对象并将指针设置为NULL)?
答案 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函数返回一个它没有分配的指针。