c++學習筆記—動態內存與智能指針淺析,學習筆記淺析
我們的程序使用內存包含以下幾種:
在c++中,普通對象離開它的作用域之後,它的的析構函數會自動調用,從而銷毀這個對象,釋放它所占用的內存,不會發生內存洩露。為了更容易的使用動態內存,新的標准庫提供了兩種智能指針類型來管理動態對象。分別為shared_ptr允許多個指針指向同一個對象,unique_ptr獨占所指向的對象。
一、shared_ptr類
1、創建智能指針
[cpp] view plaincopy
- shared_ptr<string> p1; //指向string
- shared_ptr<list<int>> p2;//指向int的list
解引用一個智能指針返回它指向的對象
2、基本用法
成員函數有:
詳細見shared_ptr基本用法參考
make_shared函數:
最安全的分配和使用動態內存的方法是調用make_shared標准庫函數,此函數在動態內存中分配一個對象並初始化它,返回指向此對象的shared_ptr,定義方式為:
[cpp] view plaincopy
- shared_ptr<vector <int>> vec = make_shared<vector <int>>(); //不傳遞任何參數,對象進行值初始化
- shared_ptr<int> p1 = make_shared<int>(1); //指向一個1的int的shared_ptr
實現智能指針原理:
我們可以認為shared_ptr有一個關聯的計數器,稱為引用計數。無論何時我們拷貝一個shared_ptr,計數器都會遞增,例如用一個shared_ptr初始化另一個shared_ptr,或將它作為參數傳遞給一個函數以及作為函數的返回值,它所關聯的計數器都會遞增,當我麼給shared_ptr賦予一個新值或是shared_ptr被銷毀時,計數器遞減。一旦一個shared_ptr的計數器變為0時,它就會自動釋放自己所管理的對象(通過析構函數)。shared_ptr還會自動釋放相關聯的內存。
二、unique_ptr類
某個時刻只能有一個unique_ptr指向一個給定對象,當unique_ptr被銷毀時,它所指向的對象也被銷毀。
1、創建unique_ptr指針
初始化必須采用直接初始化形式,並且不支持普通的拷貝和賦值操作
[cpp] view plaincopy
- unique_ptr<double> p1; //指向double,初始化為一個空指針
- unique_ptr<int> p2(new int(1)); //p2指向一個值為1的int
2、基本用法
成員函數:
詳細見unique_ptr基本用法參考
普通指針與智能指針用法示例
[cpp] view plaincopy
- #include "stdafx.h"
- #include <vector>
- #include <iostream>
- #include <memory>
- using namespace std;
-
- vector<int> alloc_new() //使用內置指針
- {
- vector<int> *vec = new vector<int>;
- return *vec;
- delete vec;
- }
-
- vector<int> alloc_shared()
- {
- shared_ptr<vector <int>> vec=make_shared<vector <int>>(); //使用智能指針
- return *vec;
- }
- vector<int> input(vector<int> &ve)
- {
- ve = alloc_new();
- int i;
- while (cin >> i)
- {
- ve.push_back(i);
- }
- return ve;
- }
- void print(vector<int> pvec)
- {
- pvec = input(pvec);
- for (auto it = pvec.begin(); it != pvec.end(); it++)
- cout << *it << endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> i;
- print(i);
- return 0;
- }