zoukankan      html  css  js  c++  java
  • Effective C++ 学习笔记(8)

    为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

      下面是一个表示String对象的类:

        class String

        {

        public:

          String(const char *value);

          ~String();

          ...

        private:

          char *data;

        };

        String::String(const char *value)

        {

          if(value)

          {

            data=new char[strlen(value)+1];

            strcpy(data,value);

          }

          else

          {

            data=new char[1];

            *data='\0';

          }

        }

        inline String::~String

        {

          delete [] data;

        }

      以上类没有声明赋值操作符和拷贝构造函数。

      如果定义这么两个对象:

        String a("Hello");

        String b("World");

      其结果如下:

        a: data->"Hello\0"

        b: data->"World\0"

      对象a的内部包含指向字符串“Hello”的内存的指针,对象b的内部是一个指向“World”所在内存的指针。

      进行下面的赋值:

        b=a;

      由于自定义的operator=,C++会生成并调用一个缺省的operator=操作符。这个缺省的操作符会完成a到b成员的逐个赋值操作,包括对指针。结果如下:

        a: data->"Hello\0"

        b: data->"Hello\0"

               "World\0"

      这种情况存在如下两个问题:

        第一,b曾经指向的内存永远不会删除,造成内存泄露。

        第二,a与b的指针指向同一内存地址,如果a的析构函数被调用,那么b也将丢失数据。

      

  • 相关阅读:
    可持续化线段树(主席树)
    2016-06-19 NOIP模拟赛
    0618图的整理
    1536 海战
    1005 生日礼物
    3280 easyfinding
    2594 解药还是毒药
    2919 选择题
    1845 二叉查找树
    1174 靶形数独
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2015741.html
Copyright © 2011-2022 走看看