前言
导入很久很久以前写的一篇技术!缅怀下以前写 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"