c++ vector造成的內存泄漏問題
更新時間:2023年08月07日 16:53:06 作者:helpdoc
這篇文章主要介紹了c++ vector造成的內存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
c++ vector造成的內存泄漏
C++中的
std::list
std::array
std::queue
std::map
std::set
std::vector
std::forward_list
std::multiset
std::multimap
std::stack
std::unorderd_map
std::unorderd_multimap
std::unorderd_set
std::unorderd_multiset
在任何成員方法中均不管理程序員動態(tài)分配的內存。
先附上解決方法
vector<Data*> g_vec; void release() { // 程序員自己管理 自己動態(tài)分配的內存 for_each(g_vec.begin(), g_vec.end(), [](Data*& iter) {delete iter; iter = nullptr; }); }
測試數(shù)據(jù):
struct Data { explicit Data(const int val) noexcept :m_var(val) { cout<<"構造函數(shù):"<<this->m_var<<endl; } Data(const Data& other) noexcept { cout<<"copy構造函數(shù):"<<other.m_var<<endl; this->m_var = other.m_var; } Data(Data&& other) noexcept { cout<<"move構造函數(shù):"<<other.m_var<<endl; this->m_var = other.m_var; other.m_var = 0; } Data& operator=(const Data& other) noexcept { if(this == &other) { return *this; } cout<<"賦值運算符函數(shù):"<<other.m_var<<endl; this->m_var = other.m_var return *this; } Data& operator=(Data&& other) noexcept { if (this == &other) { return *this; } cout<<"move賦值運算符函數(shù):"<<other.m_var<<endl; this->m_var = other.m_var; other.m_var = 0; return *this; } ~Data() { cout<<"析構函數(shù):"<<this->m_var<<endl; } private: int m_var; };
幾個重點
- vector<Data*>在vector的任何方法中和中間過程都不調用Data的成員函數(shù)。
- Data的copy構造的參數(shù)必須是const,否則報錯: <沒有可用的復制構造函數(shù)或復制構造函數(shù)聲明為"explicit">
- move構造和move賦值運算符必須是noexcept,否則調用copy構造和普通賦值運算符
內存分配策略
vector<Data*> dataVec; for (int i=0;i<10;++i) { dataVec.push_back(new Data(i + 1)); cout << "\tmem size:" << dataVec.capacity() << ", vec size:" << dataVec.size() << endl; }
vector.capacity()
返回vector當前分配的內存總量。vector.size()
返回vector當前有多少元素。
vector.push_back的過程是先判斷
if (size()==capacity()) capacity=1.5*capacity;
并不是在原來的基礎上擴大2倍。
修改capacity的三種方法
vector.reserve(size_type new_len)
如果new_len<=capacity()什么都不做;如果new_len>capacity(),重新分配內存,最后的capacity()可能>=new_lenvector.shrink_to_fit()
重新分配內存使capacity()==size(),意思就是把原來沒有用到的內存釋放掉。vector.swap
或者std::swap
,交換的過程中包含capacity的改變。
capacity誤區(qū)
- operator=, vector.assign, vector.erase, vector.clear不會修改capacity
內存釋放誤區(qū)
- vector.clear, vector.earse不會釋放程序員自己動態(tài)分配的內存
vector——防止內存溢出的處理
利用swap() 交換函數(shù),可進行內存的防止溢出。
如下所示:
vector p1; p1.resize(10000); p1.push_back(1); p1.push_back(2); p1.push_back(3); //當使用內存空間遠遠小于開辟的空間時,造成內存浪費和內存溢出的危險。 //利用匿名對象的特性:匿名對象使用結束后,內存自動回收。 vector(p1).swap(p1);
可以有效的將內存空間進行回收。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++動態(tài)內存分配(new/new[]和delete/delete[])詳解
這篇文章主要介紹了C++動態(tài)內存分配(new/new[]和delete/delete[])詳解的相關資料,需要的朋友可以參考下2017-05-05