
#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 因为你没定义拷贝构造函数导致使用了缺省拷贝构造函数。所以结果是同一片内存反复 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 有提过,如果你不确定编译器会为你生成什么函数,最好显示声明所有的构造函数,以避免意料之外的表现 |