题目:以下代码是否完全正确,执行可能得到的结果是

class A{
   int i;
};
class B{
   A *p;
public:
   B(){p=new A;}
   ~B(){delete p;}
};
void sayHello(B b){
}
int main(){
   B b;
   sayHello(b);
}

分析:

这道题主要考察的是对C++类的析构函数和指针的理解。什么是类的析构函数?
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。析构函数没有参数,所以不能被重载,没有返回类型,没有返回值。当对象的生命周期结束时,撤销类对象时候会自动调用析构函数。

知识点:

1.C++动态分配和释放内存

int* p;//分配出一片大小为 sizeof(T) 字节的内存空间,并且将该内存空间的起始地址赋值给 p
p = new int;//动态分配了一片 4 个字节大小的内存空间,而 p 指向这片空间。通过 p 可以读写该内存空间。
delete p;//用以释放动态分配的内存空间

//p 是指向动态分配的内存的指针。p 必须指向动态分配的内存空间
delete p;//程序执行出错,p 所指向的空间已经释放,p 不再是指向动态分配的内存空间的指针了。
  1. C++浅拷贝
    编译器默认使用浅拷贝,拷贝后的指针变量指向同一片内存

解答:

1.B b;这行执行完毕之后释放了p的内存
2sayHello(b);这一行编译器默认使用了浅拷贝,这里的p指向刚才被释放掉的内存区域,再执行delete p,程序执行出错,p 所指向的空间已经释放,p 不再是指向动态分配的内存空间的指针了。

解决方案:

函数参数b修改为按地址传递:&b