博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
默认复制构造函数 bitwise 语义 delete 多次----腾讯2016研发工程师笔试题(一)
阅读量:2387 次
发布时间:2019-05-10

本文共 954 字,大约阅读时间需要 3 分钟。

以下代码是否完全正确,执行可能得到的结果是____。
class A{   int i;};class B{   A *p;public:   B(){p=new A;}   ~B(){delete p;}};void sayHello(B b){}int main(){   B b;   sayHello(b);}

正确答案: C   你的答案: 空 (错误)

程序正常运行
程序编译错误
程序崩溃
程序死循环

为了清晰可见,我们从新把题目代码码一遍:
class A{   int i;};class B{   A *p;public:   B(){p=new A;}   ~B(){delete p;}   /*   B(const B& ths){       p = ths.p;   }*/};void sayHello(B x){}int main(){   B b;   sayHello(b);}
这里的错误原因是编译器在生成default copy construction的时候使用的bitwise copy语义,也就是只是简单的浅拷贝。
 上面被注释掉的程序就是编译器自动添加的部分。 从而导致在sayHello中向参数x传递值时,调用了bitwise copy的拷贝构造函数,使得x对象和b对象中的值完全一致,包括p指针的值,在x离开作用域(也就是sayHello函数结束),x发生析构,调用delete 销毁了指针p,同时在main函数结束的时候,析构b时又会调用一次delete删除指针p。
也就是本程序会delete一直已经被delete 的指针。可以做如下改进,来修复程序:
class A{   int i;};class B{   A *p;public:   B(){p=new A;}   ~B(){delete p;}   B(const B& other){       p = new A;       //构建新的指针       *p = *(other.p); //将指向的内容复制,依然指向不同的位置   }};void sayHello(B b){}int main(){   B b;   sayHello(b);}
如上,在B中添加copy 构造函数

转载地址:http://ygnab.baihongyu.com/

你可能感兴趣的文章
使用ettercap嗅探ssh口令
查看>>
Linux下的内网反弹实例
查看>>
Command execution with a MySQL UDF
查看>>
OTPs: Using s/Key with SSH via OPIE
查看>>
使用arpwatch和arping来排查ARP攻击
查看>>
Linux硬件监控方法
查看>>
RSA SecurID Authentication linux sshd PAM deploy
查看>>
转: pam 禁止某些用户使用ssh 远程登录
查看>>
小包优先+web优先+游戏爆发+单IP限速+连接数限制 脚本V2.0
查看>>
Rhel5 配置NTP服务
查看>>
定制rhel的stage2.img/minstg2.img文件
查看>>
ZZ Quick-Tip: Linux NAT in Four Steps using iptables
查看>>
北京的住房公积金是否可用于还外地的房贷
查看>>
mysqlhotcopy 热备工具体验与总结
查看>>
MooseFS安装笔记
查看>>
GlusterFS分布式集群文件系统安装、配置及性能测试
查看>>
Sakai
查看>>
Adobe ColdFusion Unspecified Directory Traversal Vulnerability
查看>>
Share:A File Checksum Integrity Verifier utility
查看>>
LDAP User Authentication On CentOS 5.x
查看>>