1. 程式人生 > >C++ STL容器型別的記憶體釋放

C++ STL容器型別的記憶體釋放

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