• C++ 三大函数该写就要写


      记得C++ 沉思录上说过,如果数据成员有指针类型的,最好把三大函数补全,不然的话容易产生浅拷贝和内存泄露。这里给出一个简单的例子。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    class CDemo
    {
    public:
           CDemo():str(new char[1])
           { 
            str[0] = '\0';
            cout<< "Construct"<<endl; 
           };
           CDemo(const char *s) : str(new char[strlen(s) + 1])
           {
              strcpy(str,s);
           }
           CDemo( const CDemo & D) : str(new char [strlen(D.c_str()) + 1])
           {
                  strcpy(str,D.c_str());
           }
           ~CDemo()
           {
                  if(str != NULL)
                  {
                         delete [] str;
                         str = nullptr;
                         cout<< "Deconstruct!"<<endl;
                  }
                  cout<< "Deconstruct finish"<<endl;
           }
           CDemo & operator = ( CDemo CD)
           {
                   swap(str, CD.str);
                   return * this;
           }
    
           char *c_str() const
           {
              return str;
           }
    
    private:
            char *str;
    };
    
    int main()
    {
           CDemo   d1("trend micro");
           CDemo d2;
           d2 = d1;
           vector<CDemo> * a1 = new vector<CDemo>();
           a1->push_back(d1);
           cout<< "d1: "<<d1.c_str()<<endl;
           cout<< "a1: "<<a1->front().c_str()<<endl;
           strcpy(a1->front().c_str(), "change"); //如果没有拷贝构造函数,则这里会出错
           cout<<a1->front().c_str()<<endl;
           delete a1; //如果不定义拷贝构造函数将出现push_back的时候的浅拷贝情况,析构a1的时候要
            //delete 类中的str,导致str被delete两次
           return 0;
    }

     

  • 相关阅读:
    C++ 安全字符串拼接
    C code 字符串与整数的相互转化
    深入解析:分布式系统的事务处理经典问题及模型
    .NET分布式事务处理总结【下】
    用csc命令行手动编译cs文件
    委托和事件
    C#中的lock关键字
    SQL索引详解
    Quartz.NET 入门
    使用Topshelf创建Windows服务
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2660975.html
Copyright © 2020-2023  润新知