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