动态分配内存的对象必须提供自定义的复制构造函数

来源:互联网 发布:工商名录采集软件 编辑:程序博客网 时间: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
原创粉丝点击