程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++學習筆記—動態內存與智能指針淺析,學習筆記淺析

c++學習筆記—動態內存與智能指針淺析,學習筆記淺析

編輯:C++入門知識

c++學習筆記—動態內存與智能指針淺析,學習筆記淺析


我們的程序使用內存包含以下幾種:

 

  在c++中,普通對象離開它的作用域之後,它的的析構函數會自動調用,從而銷毀這個對象,釋放它所占用的內存,不會發生內存洩露。為了更容易的使用動態內存,新的標准庫提供了兩種智能指針類型來管理動態對象。分別為shared_ptr允許多個指針指向同一個對象,unique_ptr獨占所指向的對象。   一、shared_ptr類 1、創建智能指針 [cpp] view plaincopy  
  1. shared_ptr<string> p1; //指向string  
  2. shared_ptr<list<int>> p2;//指向int的list  
解引用一個智能指針返回它指向的對象 2、基本用法 成員函數有:   詳細見shared_ptr基本用法參考   make_shared函數: 最安全的分配和使用動態內存的方法是調用make_shared標准庫函數,此函數在動態內存中分配一個對象並初始化它,返回指向此對象的shared_ptr,定義方式為:   [cpp] view plaincopy  
  1. shared_ptr<vector <int>> vec = make_shared<vector <int>>();  //不傳遞任何參數,對象進行值初始化  
  2. 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  
  1. unique_ptr<double> p1;   //指向double,初始化為一個空指針  
  2. unique_ptr<int> p2(new int(1));   //p2指向一個值為1的int  
2、基本用法 成員函數:
詳細見unique_ptr基本用法參考   普通指針與智能指針用法示例   [cpp] view plaincopy  
  1. #include "stdafx.h"  
  2. #include <vector>  
  3. #include <iostream>  
  4. #include <memory>  
  5. using namespace std;  
  6.   
  7. vector<int> alloc_new()      //使用內置指針  
  8. {  
  9.     vector<int> *vec = new vector<int>;  
  10.     return *vec;  
  11.     delete vec;  
  12. }  
  13.   
  14. vector<int> alloc_shared()  
  15. {  
  16.     shared_ptr<vector <int>> vec=make_shared<vector <int>>();    //使用智能指針  
  17.     return *vec;  
  18. }  
  19. vector<int> input(vector<int> &ve)  
  20. {  
  21.     ve = alloc_new();  
  22.     int i;  
  23.     while (cin >> i)  
  24.     {  
  25.         ve.push_back(i);  
  26.     }  
  27.     return ve;  
  28. }  
  29. void print(vector<int> pvec)  
  30. {  
  31.     pvec = input(pvec);  
  32.     for (auto it = pvec.begin(); it != pvec.end(); it++)  
  33.         cout << *it << endl;  
  34. }  
  35. int _tmain(int argc, _TCHAR* argv[])  
  36. {  
  37.     vector<int> i;  
  38.     print(i);  
  39.     return 0;  
  40. }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved