一个奇怪的delete 现象,希望对你有帮助

chinalongship 2008-11-01 06:21:16
编译器用的是VS2003 ,发现情况是这样的

加入自定义类 CA, 文件分别是a.cpp, a.h

在另一个类如CB中,需用到CA, 假如类CB对应的文件是b.cpp, b.h,
在b.cpp 中加入inluce "a.h",后面定义一个CA 的全局变量 CA g_ca = new CA, ...,delete g_ca;
这时候调试你会发现 CA 的析构函数首先被调用

但是当你将include "a.h" 这句放在b.h中,就不会出现这种情况,一切正常了
希望再次遇见这样问题的朋友,不会再无法解决?
但是为什么会出现这样呢?
...全文
150 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinalongship 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rulary 的回复:]
全局变量只要定义了就可以了:

CA g_ca;

这样变量的生存周期会持续到程序退出为止。楼主的代码可能是全局指针吧:
CA *g_ca;
如果是这样的话,指针指向的对象的生存时间由new和delete控制。

LZ下面这个代码明显是有问题的:
"CA g_ca = new CA "
[/Quote]

说的对 是CA* g_ca = new CA
wudeshou82666 2008-11-02
  • 打赏
  • 举报
回复
凑个热闹,对编译器好好理解也就可以解决楼主的问题
rularys 2008-11-02
  • 打赏
  • 举报
回复
全局变量只要定义了就可以了:

CA g_ca;

这样变量的生存周期会持续到程序退出为止。楼主的代码可能是全局指针吧:
CA *g_ca;
如果是这样的话,指针指向的对象的生存时间由new和delete控制。

LZ下面这个代码明显是有问题的:
"CA g_ca = new CA "
frank_ll 2008-11-01
  • 打赏
  • 举报
回复
我在2005上面尝试
首先delete不能放在全局中
不知道楼主放在那里的
请贴代码
weiyijiji 2008-11-01
  • 打赏
  • 举报
回复
LZ意思是析构函数比构造函数先调用?
chinalongship 2008-11-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chinalongship 的回复:]
全局是这样的

CA g_ca = NULL;
g_ca = new CA;
[/Quote]

CA g_ca = NULL;
...
g_ca = new CA

中间还有一段代码
chinalongship 2008-11-01
  • 打赏
  • 举报
回复
全局是这样的

CA g_ca = NULL;
g_ca = new CA;
lin_style 2008-11-01
  • 打赏
  • 举报
回复
谢谢LZ。。
很少全局还用new

或许是匹配加载的先后顺序问题?还是头文件处理时的优化问题?楼主试过其他编译器吗
chinalongship 2008-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chinalongship 的回复:]
引用 1 楼 baihacker 的回复:
CA g_ca = new CA

这句明显有问题.


class CA
{
CA(void);
~CA(void);
};

最简单的,实现就不写了。 CA g_ca = new CA 会有问题?自己实例运行看看吧
[/Quote]

还有public 了
chinalongship 2008-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
CA g_ca = new CA

这句明显有问题.
[/Quote]

class CA
{
CA(void);
~CA(void);
};

最简单的,实现就不写了。 CA g_ca = new CA 会有问题?自己实例运行看看吧
太乙 2008-11-01
  • 打赏
  • 举报
回复
CA * g_ca = new CA();

lz最好贴全代码!
太乙 2008-11-01
  • 打赏
  • 举报
回复
CA * g_ca = new CA();

lz最好贴全代码!
baihacker 2008-11-01
  • 打赏
  • 举报
回复
CA g_ca = new CA

这句明显有问题.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧