重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

动态内存管理(引用计数)-创新互联

       c++的动态内存管理是非常重要的,操作不当很容易引起内存泄漏,

成都创新互联公司为您提适合企业的网站设计 让您的网站在搜索引擎具有高度排名,让您的网站具备超强的网络竞争力!结合企业自身,进行网站设计及把握,最后结合企业文化和具体宗旨等,才能创作出一份性化解决方案。从网站策划到成都做网站、网站建设, 我们的网页设计师为您提供的解决方案。

下面我详细写了一些内存管理该注意的地方,包括引用计数的实现

深拷贝浅拷贝

#include
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);
 }

//上面两个构造函数可以合成下面一个
 String(char* str="")
  :_str(new char[strlen(str) + 1])  //开辟一段新空间给_str
 {
  strcpy(_str, str);
 }

String(const String& s)//拷贝构造
  :_str(new char[strlen(s._str) + 1])  //开辟一段新空间给_str,也就是深拷贝,使他们指向不同的空间
 {
  strcpy(_str, s._str);
 }

String& operator=(const String& s)
 {
  if (this != &s)
  {
   delete[] _str;//这里一定要注意,很容易发生内存泄露,因为原来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)   //改变字符串内容
 {
  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);//没有写自己的拷贝构造函数时,用系统默认的拷贝构造,是值拷贝,s1和s2指向同一块空间一模一样,析构时
               //会析构两次,导致崩溃

String s3("efgh");
 s3 = s1;    //需要重载赋值运算符

s3 = s3;
}

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

#include
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;
}

//引用计数相关操作

#include
#include
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;    //指向引用计数的指针
};

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


新闻标题:动态内存管理(引用计数)-创新互联
标题路径:http://cqcxhl.cn/article/djhccd.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP