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

    xiaoxiao2024-09-30  92

    本节书摘来自异步社区出版社《从缺陷中学习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; }

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

    相关资源:《从新手到高手——C 全方位学习》.pdf【第一部分】
    最新回复(0)