鱼C论坛

 找回密码
 立即注册
查看: 4950|回复: 3

动态内存和全局对象内存释放的问题

[复制链接]
发表于 2013-8-20 15:19:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小旭哥0922 于 2013-8-20 15:21 编辑

书上说,C++中,全局对象的构造函数会在main函数之前被调用,在程序结束的时候,其析构函数被调用。
但是,我程序执行的结果和书上说的貌似不是一样的。求解答。
  1. #include<iostream>
  2. #include<string>using std::cout;
  3. using std::endl;class CDemo{
  4. public:
  5. CDemo( const char* str );
  6. ~CDemo();

  7. private:
  8. char name[20];
  9. };CDemo::CDemo( const char* str ){
  10. strncpy( name, str, 20 );
  11. cout << "Constructor called for " << name << endl;
  12. }CDemo::~CDemo(){
  13. cout << "Destructor called for " << name << endl;
  14. } CDemo GlobalObject( "GlobalObject" );void main(){
  15. }
复制代码

我已经证实过,全局对象的构造函数确实是在main函数之前。
但是,并没有执行析构函数呀。怎么回事。

QQ图片20130820151959.jpg


还有一个问题就是new算子

使用new生成对象时,用delete删除对象的时候,其析构函数会被执行
但是不用delete删除的时候,好像析构函数就没有执行。
那么当没有用delete删除对象的时候,程序结束时,其内存有没有被释放啊?


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-20 18:22:15 | 显示全部楼层
你是不是用了VC6啊?换个好的编译器可以看到全局变量的释放。
new后没有delete本来就不会调用析构函数的,这种情况叫做“内存泄漏”。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-20 18:23:20 | 显示全部楼层
好吧,你用的貌似不是VC6,我的意思是说,你能用个符合C++标准的编译器么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 10:05:46 | 显示全部楼层
本帖最后由 编程难 于 2013-8-21 10:26 编辑

可以加断点,在析构函数中加断点,在main返回前加断点,可以通过顺序目测出来。
如果new了,但是没有delete。在程序运行中,造成内存泄露。

如果程序结束了,应该会被释放掉。(个人目前的认识是这样的,不保证正确,希望知道的童鞋贴点资料学习学习)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-5 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表