動態(tài)內(nèi)存管理(引用計數(shù))

        c++的動態(tài)內(nèi)存管理是非常重要的,操作不當很容易引起內(nèi)存泄漏,

我們提供的服務有:成都網(wǎng)站設計、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、可克達拉ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的可克達拉網(wǎng)站制作公司

下面我詳細寫了一些內(nèi)存管理該注意的地方,包括引用計數(shù)的實現(xiàn)

 深拷貝淺拷貝

#include <iostream>
using namespace std;

class String
{
public:

 String()
  :_str(new char[1])
 {
  *_str = '\0';
 }

 String(char* str)
  :_str(new char[strlen(str)+1])  //開辟一段新空間給_str
 {
  strcpy(_str, str);
 }

 //上面兩個構(gòu)造函數(shù)可以合成下面一個
 String(char* str="")
  :_str(new char[strlen(str) + 1])  //開辟一段新空間給_str
 {
  strcpy(_str, str);
 }

 String(const String& s)//拷貝構(gòu)造
  :_str(new char[strlen(s._str) + 1])  //開辟一段新空間給_str,也就是深拷貝,使他們指向不同的空間
 {
  strcpy(_str, s._str);
 }

 String& operator=(const String& s)    
 {
  if (this != &s)
  {
   delete[] _str;//這里一定要注意,很容易發(fā)生內(nèi)存泄露,因為原來s3就有一段空間,賦值時
                   //使s3重新指向一段空間,原來的空間就泄露了。
   _str = new char[strlen(s._str) + 1];
   strcpy(_str, s._str);
  }

  return *this;
 }

 ~String()
 {
  if (_str)
  {
   delete[]_str;
  }
 }

 char* GetStr()
 {
  return _str;
 }

 char& operator[](size_t index)   //改變字符串內(nèi)容
 {
  return _str[index];
 }

private:
 char *_str;
};

void Test1()
{
 char* p1 = "abcd";
 String s1(p1);
 cout << s1.GetStr() << endl;

 s1[0] = 'x';
 cout << s1.GetStr() << endl;

 //淺拷貝
 String s2(s1);//沒有寫自己的拷貝構(gòu)造函數(shù)時,用系統(tǒng)默認的拷貝構(gòu)造,是值拷貝,s1和s2指向同一塊空間一模一樣,析構(gòu)時
               //會析構(gòu)兩次,導致崩潰

 String s3("efgh"); 
 s3 = s1;    //需要重載賦值運算符

 s3 = s3;
}

int main()
{
 Test1();
 return 0;
}


#include <iostream>
using namespace std;

class String
{
public:
 String(char* str = "")
  :_str(new char[strlen(str) + 1])
 {
  strcpy(_str, str);
 }

 String(const String& s)
  :_str(NULL)
 {
  String tmp(s._str);
  swap(_str, tmp._str);
 }

 //String& operator=(String& s)
 //{
 // if (this != &s)
 // {
 //  String tmp(s);
 //  swap(_str, tmp._str);
 // }

 // return *this;
 //}

 String& operator=(String s)
 {
  swap(_str, s._str);

  return *this;
 }

 ~String()
 {
  if (_str)
  {
   delete[] _str;
  }
 }
private:
 char* _str;
};

void Test1()
{
 char* p1 = "abcd";
 String s1(p1);

 String s2(s1);

 String s3("efgh");
 s3 = s1;

 s3 = s3;
}

int main()
{
 Test1();
 return 0;
}


//引用計數(shù)相關操作

#include <iostream>
#include<windows.h>
using namespace std;

class String                  
{
public:
 String(char* str = "")
  :_str(new char[strlen(str) + 1])
  , _pCount(new int(1))
 {
  strcpy(_str, str);
 }

 String(const String& s)
  :_str(s._str)
  , _pCount(s._pCount)
 {
  (*_pCount)++;
 }

 String& operator=(const String& s)
 {
  if (this != &s)
  {
   this->_Release();

   _str = s._str;
   _pCount = s._pCount;
   (*_pCount)++;
  }
  return *this;
 }

 ~String()
 {
  _Release();
 }

private:
 void _Release()
 {
  if (--(*_pCount) == 0)
  {
   delete _pCount;
   delete[] _str;
  }
 }

private:
 char* _str;
 int* _pCount;    //指向引用計數(shù)的指針
};

新聞名稱:動態(tài)內(nèi)存管理(引用計數(shù))
網(wǎng)站鏈接:http://bm7419.com/article16/geipgg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、搜索引擎優(yōu)化網(wǎng)站改版、網(wǎng)站建設、品牌網(wǎng)站設計用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管