在指针的使用过程中,经常会出现一个容易被忽略的问题,那就是指针作为参数传递到方法中后,如果在方法内对指针赋值为nullptr,这个只影响方法内的指针变量的地址,不会影响方法外面的指针地址,举个🌰说明一下:
#include <iostream>
class ReleaseBean {
public:
u_int8_t *data;
};
void testRelease(ReleaseBean* bean) {
std::cout << "bean 的地址"<< bean << std::endl;
if(bean){
std::cout << "判断bean的data"<< bean << std::endl;
if(bean->data) {
delete[] bean->data;
}
delete bean;
// 这里的赋值操作是对方法内部的指针副本进行的置空操作
bean = nullptr;
std::cout << "bean 设置为 nullptr ,地址 "<< bean<< std::endl;
} else {
std::cout << "bean 为空了" << std::endl;
}
}
int main() {
std::cout << "Hello, World!" << std::endl;
ReleaseBean* bean = new ReleaseBean();
bean->data = static_cast<u_int8_t *>(malloc(10000));
// 第一次调用
testRelease(bean);
std::cout << "第二次释放前,bean的地址 "<< bean<< std::endl;
// 第二次调用
testRelease(bean);
return 0;
}
上述的代码执行过程中会报错,日志如下:
原因是什么呢?
因为指针作为参数传递到方法内部后,是通过值传递的方式传给方法的,方法内部会生成一个指向同地址的指针副本,而方法内部的置空操作也是对指针副本的操作,不会影响外部指针,这样第二次调用方法的时候bean这个指针指向的内容已经为空了,再去进行delete操作就会出错了。