美文网首页
C++前向声明隐含的问题

C++前向声明隐含的问题

作者: 成都老刘 | 来源:发表于2019-06-23 22:49 被阅读0次

    前言

    导入很久很久以前写的一篇技术!缅怀下以前写 C++ 的日子

    正文

    今天写代码的时候,遇到了一个很神奇的问题,在代码编译的时候很正常,编译成功。
    但是运行的时候,问题就出来了。

    B *b;

    我在代码中A *a = b->constructA();(constructA()在内部调用new,创建一个新的A的实例)
    即由类B的对象b生成一个类A的对象a,这里没有问题,
    我在这里什么都不做,直接调用delete a;
    神奇的时刻到来了,程序直接崩溃。

    经过几个小时的分析是因为include和前向声明的问题。

    A.h:
    class A{
    ...
    }
    
    B.h:
    class A;//这里前向声明A,
    class B{
        A * constrctA(){
              ...
        }
    }
    
    main.cpp:
    #include "B.h"
    int main(){
        B *b = new B;
        A *a = b->constructA();
        delete a;
        return 0;
    }
    

    在编译的时候,很成功,因为在B.h中,编译器找得到A这个类声明或者是定义的语句:class A;
    因此在编译的时候,没有#include “A.h”也能够正常编译!!!问题就出在这儿了。

    在运行的时候,A *a = b->constructA();没问题
    然后这儿的A并没有实现,他并没有任何函数,
    当我调用delete a;的时候,会自动调用析构函数,这样根本就找不到析构函数,

    所以,程序在运行delete a;的时候会crash。

    解决的办法就是添加#include "A.h"

    相关文章

      网友评论

          本文标题:C++前向声明隐含的问题

          本文链接:https://www.haomeiwen.com/subject/wkcgqctx.html