动态内存会被自动释放吗

本文揭示了C++中关于动态内存管理的一些常见误解,包括指针消亡并不意味着所指内存自动释放,以及内存释放后的指针状态等问题。文章强调了正确管理内存的重要性。

来自:高质量c++编程指南

函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!

 

    void Func(void)

{

    char *p = (char *) malloc(100); // 动态内存会自动释放吗?

}

示例7-6 试图让动态内存自动释放

 

    我们发现指针有一些“似是而非”的特征:

1)指针消亡了,并不表示它所指的内存会被自动释放。

2)内存被释放了,并不表示指针会消亡或者成了NULL指针。

这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以草率行事的理由:

如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为NULL了。终于可以偷懒而不会发生错误了吧?想得美。如果别人把那段程序取出来用到其它地方怎么办?

在Qt中,动态申请的内存是否会自动释放取决于具体情况。一般来说,C++中的`new`和`delete`需要成对存在,否则会导致内存泄漏,但在Qt里存在一些特殊机制可以自动释放部分动态申请的内存[^1]。 Qt对象系统中有一个重要的特性是对象的父子关系。当一个Qt对象(继承自`QObject`)被指定了父对象,在父对象被销毁,它会自动销毁所有的子对象。例如: ```cpp #include <QApplication> #include <QLabel> #include <QWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *parentWidget = new QWidget(); QLabel *label = new QLabel("Hello, Qt!", parentWidget); // 当parentWidget被销毁,label也会被自动销毁 parentWidget->show(); return a.exec(); } ``` 在这个例子中,`QLabel`对象`label`的父对象是`QWidget`对象`parentWidget`,当`parentWidget`被销毁,`label`会自动释放内存。 不过,并不是所有动态申请的内存都能通过这种方式自动释放。如果一个对象没有父对象,或者不是`QObject`的子类,那么Qt不会自动释放其内存,需要手动使用`delete`来释放,否则会造成内存泄漏[^1][^3]。例如: ```cpp #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); int *number = new int(42); // 这里number需要手动释放,Qt不会自动处理 delete number; QWidget *widget = new QWidget(); widget->show(); return a.exec(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值