簡體   English   中英

如果我不使用新關鍵字,我可以有 memory 泄漏嗎?

[英]Can I have memory leaks if I'm not using new keyword?

我是該語言的新手,我對 memory 泄漏有一個基本的疑問。 如果我不使用new關鍵字,是否有可能發生泄漏? (即在堆棧中有我的變量並使用像std::vector這樣的數據容器)

我應該擔心這個問題嗎?

如果是這種情況,有人可以給我一個在沒有動態分配 memory 的情況下創建泄漏的示例嗎?

即在堆棧中有我的變量並使用像std::vector這樣的數據容器

不,對於std::vector或其他標准容器,您不必擔心。

有人可以給我一個在沒有動態分配 memory 的情況下造成泄漏的示例嗎?

一個流行的錯誤是以下形式的循環依賴智能指針:

class Child;
class Parent {
     std::vector<std::shared_ptr<Child>> childs;
};

class Child {
     std::shared_ptr<Parent> parent;
};

由於共享指針的引用計數器永遠不會降為零,因此這些實例永遠不會被刪除並導致 memory 泄漏。

有關導致這種情況的原因以及如何避免這種情況的更多信息,請參見此處

如果您不動態保留 memory,我認為不可能泄漏 memory。 可能全局變量不會被釋放,但我不會稱之為 memory 泄漏。

但是,動態保留 memory 的方法比使用關鍵字new

例如, malloc分配一個 memory 塊。 calloc還保留 memory 並將其歸零。

您的操作還可以為您提供管理 memory 的方法。 例如 Linux 的strdup

您還可以使用智能指針並調用std::make_uniquestd::make_shared 兩種方法都動態分配 memory。

對於std::unique_ptr ,如果您調用release()並忘記刪除指針,您可能會泄漏。

 std::make_unique<int>(3).release(); // Memory leak

對於std::shared_ptr ,如果創建循環引用,則可能會泄漏。 您可以在此處找到更多信息。

此外,當您使用 static 變量時,當變量超出 scope 但在執行結束時,不會調用析構函數。 這不完全是 memory 泄漏,因為最終調用了析構函數,但您可能分配了一些 memory 並且未使用。

例如,考慮以下代碼:

#include <iostream>
#include <string>
#include <vector>

void f() 
{
    static std::vector<int> v;
    v.insert(v.begin(), 100*1024*1024, 0);
    v.clear();
}

int main()
{
    f();
    return 0;
}

不需要std::vector::clear()來釋放向量分配的 memory。 因此,在調用f()之后,您將分配 400 MB 的 memory 但只能在f()內部訪問。 不完全是 memory 泄漏,但它是分配的資源,直到最后才會自動釋放。

除了其他答案之外,memory 泄漏的簡單來源是外部庫。 其中很多,尤其是 C 或類似 C 的庫,針對其數據類型具有create_*destroy_*等函數。 即使您從未顯式調用new ,也同樣容易發生 memory 泄漏。

暫無
暫無

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

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