36-经典问题分析3-赋值深拷贝

来源:互联网 发布:绥化关键词优化排名 编辑:程序博客网 时间:2024/06/06 02:18

1、赋值的疑问

这里写图片描述

2、

这里写图片描述

#include <iostream>#include <string>using namespace std;class Test{    int* m_pointer;public:    Test()    {        m_pointer = NULL;    }    Test(int i)    {        m_pointer = new int(i);    }    void print()    {        cout << "m_pointer = " << hex << m_pointer << endl;    }    ~Test()    {        delete m_pointer;    }};int main(){    Test t1 = 1;    Test t2;    t1.print();    t2.print();    t2 = t1;//赋值操作    t1.print();    t2.print();    return 0;}m_pointer = 0x2027c20m_pointer = 0m_pointer = 0x2027c20m_pointer = 0x2027c20*** Error in `./a.out': double free or corruption (fasttop): 0x0000000002027c20 ***由于默认生成的赋值操作符为浅拷贝,所以对象的成员变量指向同一个内存地址空间,在对象结束时调用析构函数会连续对一片内存空间释放两次造成内存崩溃

3、

这里写图片描述

4、

这里写图片描述
对象的成员存在动态内存申请操作时 一定要自定义实现深拷贝(拷贝构造函数和赋值操作符)

    Test(const Test& obj)//拷贝构造函数 深拷贝    {        m_pointer = new int(*obj.m_pointer);//创建堆空间并用obj.m_pointer的值初始化堆空间    }    Test& operator = (const Test& obj)//赋值操作符 也要实现深拷贝    {        if( this != &obj )//防止 自赋值,通过对象地址判断        {            delete m_pointer;//释放原有的内存            m_pointer = new int(*obj.m_pointer);//创建新的堆空间        }        return *this;//返回对象的引用,返回值为Test& 是为了实现连续赋值    }m_pointer = 0xb0fc20m_pointer = 0m_pointer = 0xb0fc20m_pointer = 0xb10050

5、

这里写图片描述
空类编译器会自动实现4个默认函数
构造函数
拷贝构造函数(浅拷贝)
赋值操作符(浅拷贝)
析构函数

6、string的疑问

这里写图片描述
12345
12345
p为野指针
append后内存地址改变了,

7、

这里写图片描述

8、

这里写图片描述
s为空,尽量不要用c语言的操作方式操作c++中的字符串

9、

这里写图片描述

10、小结

这里写图片描述

原创粉丝点击