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、小结
阅读全文
0 0
- 36-经典问题分析3-赋值深拷贝
- python赋值/拷贝问题
- c++类中浅拷贝问题和赋值问题
- 类的赋值函数和拷贝构造函数以及深、浅拷贝问题
- python中的赋值、浅拷贝、深拷贝
- python 赋值、浅拷贝与深拷贝
- 赋值、浅拷贝和深拷贝
- python赋值,浅拷贝及深拷贝
- Python赋值、浅拷贝、深拷贝
- 浅拷贝、深拷贝、浅赋值、深赋值
- 浅拷贝问题分析
- ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝
- 拷贝构造函数与赋值函数;深拷贝,浅拷贝
- 拷贝构造-赋值构造-深拷贝-浅拷贝
- ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝
- C ++ 拷贝构造函数和赋值构造函数 非常经典
- 从一道面试题看深拷贝、浅拷贝构造函数问题 (经典)
- 拷贝构造、赋值构造、深拷贝、浅拷贝、位拷贝、值拷贝
- JSP
- py基础必过
- 同时加入两个精灵
- LintCode_002_尾部的零
- Linux系统的分区
- 36-经典问题分析3-赋值深拷贝
- 程序员炼造之路——女技术小白的选择
- sprintf 编辑 sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有
- WebApplicationContext类的作用
- Swift学习笔记(8)——集合Set
- 75. Sort Colors
- Leetcode(W7):5. Longest Palindromic Substring(动态规划)
- leetcode 练习(15,355)
- 算法设计周记(八)--层次遍历