动态分配内存的对象必须提供自定义的复制构造函数
来源:互联网 发布:工商名录采集软件 编辑:程序博客网 时间:2024/06/06 14:05
如何没有编写复制构造函数或赋值运算符,C++将自动生成,当为对象分配动态内存时,将会引发问题。
class A { int i;};class B { A *p;public: B() { p = new A; } ~B() { delete p; }};void sayHello(B b1) {}int main() { B b; sayHello(b);}
B 包含了一个指针变量 p,B的表层复制给目标对象提供了一个p指针的副本,但没有复制底层数据,最终b、b1都有了指向同一数据的指针。更糟糕的是当sayHello()退出时,会调用b1的析构函数,释放p所指向的内存,现在b所拥有的指针所指向的内存不在有效,成为悬挂指针。
当使用赋值时,情况会变得更糟糕:
B b2, b3;
b2 = b3;
当执行赋值语句后,b2、b3指向同一内存,而且b2所指向的内存被遗弃,造成内存泄露。
这就是在赋值运算符中首先释放左边引用内存,然后进行深层复制的原因
错题:
https://www.nowcoder.com/questionTerminal/94cc380a927d440c882b21fa6359ee4d?toCommentId=1128663
阅读全文
0 0
- 动态分配内存的对象必须提供自定义的复制构造函数
- vector装入自定义类多个对象的时候复制构造函数参数必须有const修饰
- Effective C++(十一):为需要动态分配内存的类声明一个复制构造函数和一个赋值操作符
- 包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符
- C++——必须使用复制构造函数的情况
- C++ - 类的自定义构造器 非动态分配内存情况 示例
- C++对象模型之复制构造函数的构造操作
- C++对象模型-复制构造函数的构造操作
- 对象的赋值、对象的复制(拷贝构造函数)
- 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 为需要动态分配内存的类声明一个拷贝构造函数和赋值操作符
- 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。
- 必须定义复制构造函数
- malloc函数动态分配内存的策略
- malloc函数动态分配内存的策略
- UFLDL 教程学习笔记:4.Softmax回归
- 高性能网络编程(五)----IO复用与并发编程
- 基于Modbus TCP-IP协议的WEINVIEW HMI与PC通讯
- MyBatis之TypeHandler解析
- UFLDL 教程学习笔记:5.自我学习与无监督特征学习
- 动态分配内存的对象必须提供自定义的复制构造函数
- 高性能网络编程(六)----reactor反应堆与定时器管理
- SVN 入门
- UFLDL 教程学习笔记:6.建立分类用深度网络
- Redis 内存使用优化与存储
- 一维数组与二维数组的区别
- Dragon of Loowater UVA
- UFLDL 教程学习笔记:7.自编码线性解码器
- 权限管理系统