| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2936 人关注过本帖
标题:为什么在主函数创建一个指针对象的时候,在程序结束时不会自动调用析构?
只看楼主 加入收藏
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
结帖率:63.64%
收藏
已结贴  问题点数:9 回复次数:3 
为什么在主函数创建一个指针对象的时候,在程序结束时不会自动调用析构?
程序代码:
class myc
{
public:

    myc(char * str = "")
    {
        m_nSize = strlen(str);
        m_pStr = new char[m_nSize + 1];
        memcpy(m_pStr, str,m_nSize);
    }

    ~myc()
    {
        delete[]m_pStr;
    }

private:
    char *m_pStr;
    int m_nSize;
    
};

int main()
{
    myc s1("hello world");
    myc *s2=new myc("hello world");

//    delete s2;

    return 0;
}

问题:在执行myc s1("hello world")完后会自动调用析构!执行myc *s2=new myc("hello world")结束后为什么不会自动调用析构函数?加上delete s2时会调用析构函数释放内存,但是s2本身却没有被释放,如果s2没有释放 不就造成内存泄漏了吗?求大佬帮忙解释下,多谢!
搜索更多相关主题的帖子: 自动 调用 析构 hello world 
2018-10-04 19:12
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
任何型别 T 对应的指针型别 T * 都有 trivial destructor
所以注释 delete s2 会造成两个地方泄露
一个是 s2 另外一个是属性成员 s2::m_pStr
2018-10-05 01:09
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
收藏
得分:0 
以下是引用Jonny0201在2018-10-5 01:09:05的发言:

任何型别 T 对应的指针型别 T * 都有 trivial destructor
所以注释 delete s2 会造成两个地方泄露
一个是 s2 另外一个是属性成员 s2::m_pStr

我还是不懂为什么s1会自动调用析构而s2 不会自动调用?
而且就算写了delete s2 也只是析构掉s2内部的m_pStr。s2本身却没有释放掉,这是为什么?麻烦大佬讲的详细点(本人新手),谢谢!
2018-10-05 09:46
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:9 
回复 3楼 libinden71
在主函数结束的时候, 会释放主函数内的所有变量
对于自定的 class 来说, 就会调用他的析构函数
而指针并不是自定的 class, 属于 C++ 自带的型别, 所以释放指针本身并不需要去调用指针的析构函数, 因为所有指针都有 trivial destructor
delete 一个指针是首先去调用一个对象的析构函数, 然后才释放对应的内存
2018-10-05 11:40
快速回复:为什么在主函数创建一个指针对象的时候,在程序结束时不会自动调用析构 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030334 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved