代码:

 #include <iostream>
#include <cstring> using namespace std; class mystring{
public:
mystring(string s){
cout<<"Constructor called."<<endl;
ptr = new char[s.length()+];
strcpy(ptr,s.c_str());
}
~mystring(){
cout<<"Destructor called.---"<<ptr<<endl;
delete ptr;
}
mystring &operator=(const mystring&);
private:
char* ptr;
}; mystring& mystring::operator=(const mystring& s){
if(this == &s) return *this;
cout<<this<<" "<<sizeof(this)<<endl;
delete ptr;
ptr = new char[strlen(s.ptr)+];
strcpy(ptr,s.ptr);
return *this;
} int main(){
mystring p1("hello");
mystring p2("OK");
p1 = p2; return ;
}

输出:

Constructor called.
Constructor called.
0x7ffeb8555900 8
Destructor called.---OK
Destructor called.---OK

分析:

显式定义赋值运算符重载函数,在复制时释放动态分配的内存空间并重新分配新的空间。假如没有重载赋值运算符,p1和p2指向同一块内存空间,程序结束时会导致对同一块内存空间的两次释放,这是不允许的。详见《C++面向对象程序设计教程》(第三版) 5.2.6节

C++深层复制解决指针悬挂的更多相关文章

  1. C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现

    指针悬挂: 问题:使用new申请的内存内存空间无法访问,也无法释放. 原因:直接对指向new申请的存储空间的指针变量进行赋值修改 后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还 ...

  2. Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...

  3. c++中深层复制(浅层复制运行错误)成功运行-----sample

    下面随笔给出c++中深层复制(浅层复制运行错误)成功运行------sample. 浅层复制与深层复制 浅层复制 实现对象间数据元素的一一对应复制. 深层复制 当被复制的对象数据成员是指针类型时,不是 ...

  4. java数组对象的浅层复制与深层复制

    实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

  5. js中的深层复制

    同java一样,数据的复制,不小心就是一个浅复制,莫名其妙的数据就被修改了,所以我们需要考虑深层复制的问题.这里提供一个深层复制的方法. 1.脚本 /** * 深层复制 */ cloneObject ...

  6. C++(二十三) — 内存泄漏及指针悬挂

    1.内存泄漏 动态申请的内存空间没有正常释放,但也不能继续使用. ; pch1 = new char('A'); // 此处申请的空间未被释放. char *pch2 = new char; pch1 ...

  7. 内存泄漏与指针悬挂&野指针介绍

    内存泄漏概念:内存泄漏时指动态申请的内存空间没有正常释放,但是也不能继续使用的情况. 例如: char *ch1; ch1 = new char('A'); char = *ch2 = new cha ...

  8. Java深层复制方式

    为什么需要深层复制 Object 的 clone() 方法是浅层复制(但是 native 很高效).另外,Java 提供了数组和集合的复制方法,分别是 Arrays.copy() 和 Collecti ...

  9. wincc项目移植和复制解决办法

    wincc项目复制 wincc项目不支持直接复制,部分的后台数据库在活跃状态,直接复制wincc项目,会提示跳过活跃状态的数据库,当跳过活跃数据库时,复制的项目也是无效的.在wincc项目管理器中打不 ...

随机推荐

  1. Android热补丁动态修复

    1.前言 由于公司项目中使用到热修复技术,之前对这块技术知之甚少,所以有时间去学习了解了一下. 2.学习资源 2.1 热修复介绍 还是鸿洋老师的精彩讲解,中间引用了Andorid dex分包方案和QQ ...

  2. iOS开发:UILabel无法响应点击事件的问题

    UILabel 是默认关闭用户的交互的 即: _contentLabel.userInteractionEnabled = NO; 修改之后: _contentLabel.userInteractio ...

  3. Lintcode--007(不同的子序列)

    题目:http://www.lintcode.com/zh-cn/problem/distinct-subsequences/ 2016-08-25 给出字符串S和字符串T,计算S的不同的子序列中T出 ...

  4. 单片机串口通讯RXD与TXD如何对接详解

    相信很多人都对单片机与计算机或者芯片通信时,RXD与TXD如何连接比较困惑.因为在一些电路图中,有的是直连接法,有的是交叉接法,让人有点摸不着头脑. 首先需要明白两个概念,就是DTE和DCE.DTE是 ...

  5. QuickReport多页打印

    You use composite reports for this(TQrCompositeReport) on the quickreports tabTake a look in the Dem ...

  6. scriptol图像处理算法

    神奇的图像处理算法   相似图片搜索是利用数学算法,进行高难度图像处理的一个例子.事实上,图像处理的数学算法,已经发展到令人叹为观止的地步. Scriptol列出了几种神奇的图像处理算法,让我们一起来 ...

  7. C#使用.net.mail配置163邮箱报错:不允许使用邮箱名称。 服务器响应为:authentication is required,smtp9,DcCowABHK4UYE11W2k6fAQ--.52196S2 1448940312

    client.UseDefaultCredentials = true; 要放在 client.Credentials = new NetworkCredential("用户名", ...

  8. BOT、BT、PPP形式介绍(3)

    PPP     20世纪90年代后,一种崭新的融资模式-PPP模式(Public-Private-Partnership,即“公共部门-私人企业-合作”的模式)在西方特别是欧洲流行起来,在公共基础设施 ...

  9. Git本地版本控制备忘

    首先git是一个版本控制工具,类似于SVN 笔记包括两部分,git本地版本控制和git远程协助 一.Git本地版本控制 以git windows版本msysgit为例,下载地址http://msysg ...

  10. hdu 5159 Card (期望)

    Problem Description There are x cards on the desk, they are numbered from 1 to x. The score of the c ...