2013-10-29 31 views
1

this question OP探索了一个函数的思想,该函数返回一个动态创建的对象的引用。当一个函数返回一个指针时,它是否指示我负责指针内存管理?

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

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

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

+0

您需要检查该接口的文档。为了你自己,写出更好的界面! – BoBTFish

+0

它取决于api。 – user1810087

+0

除非文件记录不完整,否则将在文档中明确说明。 –

回答

2

这是否意味着我有责任在他们不再需要时清理它们?

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

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

+0

如果函数的'user'不负责返回的对象,为什么函数会返回一个指针而不是引用? – TheMeaningfulEngineer

+1

@Alan:可能有很多原因。前两个想到的是:(1)指针可能是NULL(引用不能)。 (2)程序员可能习惯性地使用指针,这些指针可能更合适(可能是因为它们来自C背景)。 – NPE

0

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

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

+0

我明白它可以是未定义的在C中没有引用。我的目标是C++ – TheMeaningfulEngineer

+0

@Alan你问到“函数返回一个指针”。我站在我和其他人所说的话:“这取决于,看文档”。你可能想澄清你的问题。 – manuell

+0

我没有明确指定C++,因为它在c中没有的标记中。我不知道建议的做法是与标签一起额外明确定义问题范围。如果你这样做,请发布规则/最佳做法的参考。 – TheMeaningfulEngineer

1

通常不是,但它取决于。通常情况下,工厂函数 返回指针,你必须删除(但也有 例外,以及);其他功能将返回 指针,你不应该删除。

一个惯例是,这回你 应该删除指针的函数应该(在C++ 11或 std::unique_ptr)返回std::auto_ptr。有一段时间,这是建议的高度 ,但它似乎并没有被广泛采用。

除了这些约定,您通常需要阅读 库文档。

1

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

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

相关问题