题目:以下代码是否完全正确,执行可能得到的结果是
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 不再是指向动态分配的内存空间的指针了。
- C++浅拷贝
编译器默认使用浅拷贝,拷贝后的指针变量指向同一片内存
解答:
1.B b;这行执行完毕之后释放了p的内存
2sayHello(b);这一行编译器默认使用了浅拷贝,这里的p指向刚才被释放掉的内存区域,再执行delete p,程序执行出错,p 所指向的空间已经释放,p 不再是指向动态分配的内存空间的指针了。
解决方案:
函数参数b修改为按地址传递:&b