出错原因

2019-11-09 23:13:17 +08:00
 codechaser
#include <stdio.h>
#include <iostream>

using namespace std;

class A{
    int i;
};

class B{
    A* p;
    public:
    B(){p=new A;}
    ~B(){delete p;}
};

void say(B b){

}

int main(int argc,char** argv){
    B b;
    say(b);
}

这里会出错是因为浅拷贝导致的吗?

3058 次点击
所在节点    C++
5 条回复
pagxir
2019-11-09 23:16:33 +08:00
因为你没定义拷贝构造函数导致使用了缺省拷贝构造函数。所以结果是同一片内存反复 delete 两次。
secondwtq
2019-11-09 23:17:27 +08:00
天灭 raw pointer, unique_ptr 保平安
codechaser
2019-11-09 23:19:38 +08:00
@secondwtq 这只是一道题,哈哈。
v2byy
2019-11-10 10:35:38 +08:00
the rule of five. 需要任意之一,一般情况下其他也可能需要
nightwitch
2019-11-10 11:58:31 +08:00
B 类的拷贝构造函数不会重新为 p 指针申请内存,导致 p 指针浅复制一次,double free.
C++ primer 有提过,如果你不确定编译器会为你生成什么函数,最好显示声明所有的构造函数,以避免意料之外的表现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX