簡體   English   中英

當一個函數返回一個指針時,是否意味着我要負責指針的內存管理?

[英]When a function returns a pointer, is it impling that i'm responsible for the pointers memory management?

這個問題中 ,OP探索了一個函數的概念,該函數返回動態創建的對象上的引用。

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

答案是,即使這會編譯,也會使正在使用該函數的程序員感到困惑。 他會感到困惑,因為期望當函數返回引用時,該引用的“用戶”對其內存管理不承擔任何責任。

我注意到,有很多API方法可以返回指針。 這是否意味着一旦不再需要它們負責清除(刪除對象並將指針設置為NULL)?

難道意味着一旦不再需要它們,我就要負責清理它們?

通常但並非總是如此。 當然,您需要檢查文檔以了解所使用的特定API。

在您自己的API中,您應該優先選擇智能指針而不是原始指針。 這使意圖很明確,並簡化了許多內存管理問題。

通常不行,但這要視情況而定。 通常,工廠函數返回您必須刪除的指針(但是也有例外)。 其他函數將返回您不應刪除的指針。

一種約定是,返回應刪除指針的函數應返回std::auto_ptr (或C ++ 11中的std::unique_ptr )。 曾一度強烈建議這樣做,但似乎並未被廣泛采用。

除了這些約定外,您通常必須閱讀庫文檔。

指針本身不具有所有權的含義,並且指針通常用於指代不應擁有的對象。 如果要通過處理指針來管理資源,則需要記錄應該擁有哪些指針。 然后,您只希望希望用戶閱讀並遵循文檔,並且以后的維護人員不要讓代碼和文檔分散。

要明確聲明並強制執行所有權,請返回智能指針或容器。 這些具有使用RAII來解決否則幾乎不可避免的異常安全問題的好處。 在這種情況下,由於要返回動態數組,因此最合適的是std::vector<int>std::unique_ptr<int[]>

這取決於API。 請參閱文檔。

C strdup函數返回一個完成后應釋放的指針(API為您分配了該指針)C strcpy函數返回一個未分配的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM