C++ STL容器型別的記憶體釋放
阿新 • • 發佈:2019-01-22
C++ 的大部分STL容器型別不會隨著生命週期的結束而自動釋放記憶體,接下來將依次對其說明:
1. vector 型別
經測試,直到C++11的vector型別,用clear或者erase都無法釋放記憶體,只有顯示呼叫swap:
std::vector<T>.swap(t_value);
才能釋放。
vector析構時會釋放記憶體空間。
如下例:
void testVectorMemory() { std::string str; str.append(1024, 'c'); sleep(5); std::cout << "Before add vector: " << getVirtualMemory() << std::endl; std::vector<std::string> testVec; for (size_t i = 0; i<100000; i++) { testVec.push_back(str); } std::cout << "After add vector: " << getVirtualMemory() << std::endl; sleep(5); std::vector<std::string>::iterator iter = testVec.begin(); for (; iter!=testVec.end();) { iter = testVec.erase(iter); } std::cout << "After erase vector: " << getVirtualMemory() << std::endl; sleep(5); } int main(int argc, char *argv[]) { std::cout << "Before test: " << getVirtualMemory() << std::endl; testVectorMemory(); sleep(10); std::cout << "After test: " << getVirtualMemory() << std::endl; sleep(100); std::cout << "After test, after 100 seconds: " << getVirtualMemory() << std::endl; return 0; }
測試結果:
Before test: 4088
Before add vector: 4096
After add vector: 4620
After erase vector: 4624
After test: 4112
After test, after 100 seconds: 4116
2. map型別
經測試,map分配的空間無法被釋放,無論是erase, swap,就算作為區域性變數,析構後也不釋放
測試程式碼:
void testMapMemory() { std::string str; str.append(1024, 'c'); sleep(5); std::cout << "Before add map: " << getVirtualMemory() << std::endl; std::map<int, std::string> tempMap; for (size_t i = 0; i<100000; i++) { tempMap[i] = str; } std::cout << "After add map: " << getVirtualMemory() << std::endl; sleep(5); std::map<int, std::string>::iterator iter = tempMap.begin(); for (; iter!=tempMap.end();) { iter = tempMap.erase(iter); } std::cout << "After erase map: " << getVirtualMemory() << std::endl; sleep(5); std::map<int, std::string>().swap(tempMap); std::cout << "After swap map: " << getVirtualMemory() << std::endl; sleep(5); } int main(int argc, char *argv[]) { std::cout << "Before test: " << getVirtualMemory() << std::endl; testMapMemory(); sleep(10); std::cout << "After test: " << getVirtualMemory() << std::endl; sleep(100); std::cout << "After test, after 100 seconds: " << getVirtualMemory() << std::endl; return 0; }
測試結果:
Before test: 4096
Before add map: 4104
After add map: 7144
After erase map: 7148
After swap map: 7152
After test: 7156
After test, after 100 seconds: 7160
3. queue型別
經測試,pop方法只是刪除資料,並未釋放記憶體。swap方法或者析構只釋放了部分記憶體。
程式碼:
void testQueueMemory() { std::string str; str.append(1024, 'c'); sleep(5); std::cout << "Before add queue: " << getVirtualMemory() << std::endl; //. test basic type std::queue<std::string> basicQueue; for (size_t i = 0; i<100000; i++) { basicQueue.push(str); } std::cout << "After add queue: " << getVirtualMemory() << std::endl; sleep(5); while(!basicQueue.empty()) { basicQueue.pop(); } std::cout << "After pop queue: " << getVirtualMemory() << std::endl; sleep(5); std::queue<std::string>().swap(basicQueue); std::cout << "After swap queue: " << getVirtualMemory() << std::endl; sleep(5); } int main(int argc, char *argv[]) { std::cout << "Before test: " << getVirtualMemory() << std::endl; testQueueMemory(); sleep(10); std::cout << "After test: " << getVirtualMemory() << std::endl; sleep(100); std::cout << "After test, after 100 seconds: " << getVirtualMemory() << std::endl; return 0; }
測試結果:
Before test: 4096
Before add queue: 4104
After add queue: 4504
After pop queue: 4508
After swap queue: 4232
After test: 4236
After test, after 100 seconds: 4240
4. deque型別
deque型別與queue型別唯一的區別是:
deque在使用pop後會釋放一部分記憶體
程式碼:
void testDequeMemory()
{
std::string str;
str.append(1024, 'c');
sleep(5);
std::cout << "Before add queue: " << getVirtualMemory() << std::endl;
//. test basic type
std::deque<std::string> basicQueue;
for (size_t i = 0; i<100000; i++)
{
basicQueue.push_back(str);
}
std::cout << "After add queue: " << getVirtualMemory() << std::endl;
sleep(5);
while(!basicQueue.empty())
{
basicQueue.pop_back();
}
std::cout << "After pop queue: " << getVirtualMemory() << std::endl;
sleep(5);
}
int main(int argc, char *argv[])
{
std::cout << "Before test: " << getVirtualMemory() << std::endl;
testDequeMemory();
sleep(10);
std::cout << "After test: " << getVirtualMemory() << std::endl;
sleep(100);
std::cout << "After test, after 100 seconds: " << getVirtualMemory() << std::endl;
return 0;
}
測試結果:
Before test: 4096
Before add queue: 4104
After add queue: 4504
After pop queue: 4340
After test: 4232
After test, after 100 seconds: 4236