C++ Code Snippet -- 指针参数的传递

111 阅读1分钟

在指针的使用过程中,经常会出现一个容易被忽略的问题,那就是指针作为参数传递到方法中后,如果在方法内对指针赋值为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;
}

上述的代码执行过程中会报错,日志如下:

image.png

原因是什么呢?

因为指针作为参数传递到方法内部后,是通过值传递的方式传给方法的,方法内部会生成一个指向同地址的指针副本,而方法内部的置空操作也是对指针副本的操作,不会影响外部指针,这样第二次调用方法的时候bean这个指针指向的内容已经为空了,再去进行delete操作就会出错了。