![](/img/trans.png)
[英]Do I have to use delete to avoid memory leaks? I have used new to allocate the structure instances
[英]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_unique
或std::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.