如果我在使用新的和结束的程序分配数据后没有调用删除运算符,会发生什么情况?
What happens if I didn't call delete operator after allocating data using new and ending program?
如果在使用new分配数据后没有调用delete操作符会发生什么?我知道已经分配的数据在释放之前是不可用的,但是在结束程序之后呢?
为什么PC似乎有恶心xD,我的意思是它很慢,但过了一段时间它的性能变得更好,但不像之前的程序执行?
当程序结束时,它所请求的所有内存(堆栈、堆等)将被操作系统占用。
我想你已经看到了将有用的程序从主存驱逐到磁盘的效果。
您故意泄漏的程序试图分配系统上的所有内存。为了满足你的程序的需求,Windows会在系统中寻找其他程序,将它们的内存写入页面文件,并将它们的内存重新分配给你的程序。当你看到页面文件的使用率跳到最大值时,这是因为大多数其他程序都被塞进了主存,而不是主存。
当你的程序退出时,Windows会回收所有程序的内存(如其他人所指出的)。但是计算机上所有其他程序的内存仍然保存在磁盘上的页面文件中,而不是在主内存中。因此,当它们运行时,Windows必须从磁盘加载它们的内存页面,这使得程序看起来很慢。一段时间后,程序将移回主存,性能将恢复正常。
假设您编写了自己版本的'ls'命令,并且内存管理非常差,每次运行都会泄漏10 MB,这是一个很大的泄漏。这有关系吗?不是真的。当程序退出时,系统将回收所有内存,这很可能是程序启动后的几分之一秒。当然,你的自尊心会受到影响,工艺也会降低,但系统不会受到影响。用户可能永远不会知道内存管理有多糟糕。
现在假设您编写了自己的Apache版本。预计它一次可以运行几个月而不需要重新启动,所以即使它泄漏了少量内存,也会随着时间的推移而累积并导致问题。用户可能知道这一点。系统管理员当然会。
总结一下,操作系统做了正确的事情,回收了内存。有漏洞的软件是不好的。但在某些情况下,这并不重要。
程序分配但未释放的所有内存将在程序结束时自动释放。也就是说,在你的程序完成后,它不再对操作系统有任何影响。
堆和堆栈内存分配给每个进程。动态分配发生在堆上。每个可执行文件或程序在一个进程中运行。因此,一旦程序结束,堆和为该进程分配的堆栈就会返回给操作系统。这包括泄漏动态内存。
一旦程序结束,它应该对操作系统的性能没有影响。
内存本身不是问题,它将自动重新声明。
是其他资源,因为对象析构函数没有被整齐地调用(因为没有删除内存,所以析构函数没有被调用)。关闭这些资源
简单的例子有:
- 套接字如果没有正确关闭,可能会在一两分钟内无法使用。
- DB句柄可能导致DB耗尽所有连接。由于线路上的静电,空间站旋转出轨道。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 使用运算符调用 void 函数时出错<set>
- C++:使用运算符 = 调用多参数构造函数
- 重载模板运算符调用单独的类运算符
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- C++ - 从移动分配运算符调用复制分配
- 从赋值运算符调用构造函数
- C++ 为什么运算符>会中断嵌套的运算符()调用?
- 显式运算符 = 调用和 = 运算符之间是否有区别
- 全局新运算符调用语法
- (C++)从派生类运算符调用基运算符
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- 函数可以使用点运算符调用另一个功能
- 为什么这个运算符=调用不明确
- 对重载运算符调用QMetaObject
- 重载unique_ptr运算符调用make_unique
- 对于什么对象指针值,指向成员的指针运算符调用未定义的行为
- 从重载的下标运算符调用虚函数
- 从运算符调用纯虚函数<<
- 可变参数扩展是否可以用作逗号运算符调用链