簡體   English   中英

容器中的C ++ STL內存管理

[英]C++ STL memory management in containers

我正在編寫一些關鍵任務代碼,我必須確保它完全沒有內存泄漏。 我寫了一個小函數,允許我在運行時檢索內存使用情況,並在執行某些代碼(應該是無泄漏的)之前和之后進行測量,以查看內存使用情況是否保持在同一級別。

在調試一段“泄漏”的代碼時,我終於找到了成為矢量容器的罪魁禍首。

重現我所看到的最小代碼如下:

vector<char*>* v = new vector<char*>();
int n = 1024*1024;
while (n--)
{
     v->push_back(new char[256]()); // A
}
for (vector<char*>::iterator it=v->begin() ; it!=v->end() ; ++it )
{
     delete[] (*it);
}
delete v;

如果您運行該代碼(當然禁用編譯器優化, -O0 )並在最后放置一些陷阱以使程序不退出(如cin.ignore(); )您將看到您的程序應該使用大約20Mb記憶的左右。

我想知道為什么會這樣。 有一條我用A標記的行,如果你分配一個更大的char數組,你會發現末尾的“剩余”內存也更大。 我不會將此稱為泄漏,因為如果我分配並填充另一個STL容器,顯然可以重用內存,但我仍然期望在代碼完成時完全釋放該內存。

有人可以解釋為什么這個記憶仍然被使用? 我怎么能把它“真正”釋放呢?

關於我的編譯環境的一些細節:

Using clang++: Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

Compiling with: g++ -std=c++11 -g -Wall -Wextra -Wpedantic -O0 main.cc -o main.out

首先,沒有理由在您的方案中動態分配容器。 為什么?

其次,它是char*的容器,雖然它負責管理這些,但是對於他們指向(或不指向)的任何內容,您將保留全部和唯一的責任!

考慮使用vector<char>unique_ptr<char>string或類似的東西作為元素類型讓vector接受該任務。

最后,請記住,運行時系統使用自己的基於OS原語構建的分配器,因此分配內存不會直接轉換為對OS的請求,也不會立即釋放/刪除它。
這樣做會非常低效

如果你真的想確保將釋放的內存返回給操作系統,你基本上有兩個選項(它們都涉及編寫你自己的分配器,或者找到並使用其他人構建的):

  • 用您自己的替換可替換的全局分配和釋放功能。
  • 使用您自己的分配器僅用於那些分配(標准容器是分配器感知的,這意味着您可以基於每個容器提供自己的分配器)。

完成后,只需要求分配器將所有內容釋放回操作系統。

暫無
暫無

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

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