《从缺陷中学习C/C++》——6.8 指针释放后再次使用

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.8节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.8 指针释放后再次使用

从缺陷中学习C/C++
代码示例

class MyClass{
private:
    int m_val;
public:
    MyClass(int value){
         m_val = value;
        printf("new class A\n");
    }
    void getValue(){
        printf("%d\n",m_val);
    }
};
void function_a()
{
  MyClass *A = new MyClass (1);
  function_b(A);
  function_c(A);
}
void function_b(MyClass *& A)
{
  MyClass *B = new MyClass(2);
  A->getValue();
  B->getValue();
  delete A;
  A = NULL;
  delete B;
  B = NULL;}
void function_c(MyClass *&A){
  A->getValue();
}
int main()
{
    function_a();
    return 0;
}

现象&结果
程序运行时出现coredump。

Bug分析
上述代码中,在函数function_a中实例化了MyClass对象指针A,然后调用函数function_b,在function_b中,对指针A操作之后,执行delete操作,将A所指对象释放掉。随后,function_a调用函数function_c,在function_c中又再次操作指针A。

此时,指针A为空,因此,当调用A→getValue时发生coredump。这里存在的一个问题是编码风格不好,对象的分配使用释放混乱。

一个函数分配,一个函数释放,一个函数再次使用。导致function_c不知道前面A已经被释放。避免这种问题的一个办法是:编码时遵循“谁分配,谁释放”的原则。即对象在哪里分配,就在哪里释放。

正确代码

void function_a()
{
  MyClass *A = new MyClass (1);
  function_b(A);
  function_c(A);
  delete A;
  A = NULL;
}
void function_b(MyClass *& A)
{
  MyClass *B = new MyClass (2);
  A->getValue();
  B->getValue();
  delete B;
  B = NULL;
}
void function_c(MyClass *&A){
A->getValue();
}
int main()
{
    function_a();
    return 0;
}

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值