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也将丢失数据。

      

  • 相关阅读:
    HTML5之Canvas影片广场
    iOS英语—》中国本土化,如调用专辑,摄像头的变化“cancel”,“photos”至“撤消”,“摄像头”
    约瑟夫问题解决
    2014在百度之星资格赛的第二个问题Disk Schedule
    2015第30周二
    2015第30周一
    2015第29周日
    2015第29周六Spring
    2015第29周五AOP
    2015第29周四
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2015741.html
Copyright © 2011-2022 走看看