【问题标题】:are pointers released from memory when c++ program end?c++程序结束时指针会从内存中释放吗?
【发布时间】:2012-10-04 05:16:51
【问题描述】:

这是一个初学者的问题,但我学习了 c# 编程,现在我正在转向 c++,现在我正在使用指针,我知道当我完成它们时我必须从内存中释放它们,但是当程序已关闭,它们是从内存中删除还是留在那里?

【问题讨论】:

    标签: c++ memory pointers


    【解决方案1】:

    除非您删除它,否则您分配的内存(例如使用 New 关键字)将保留在那里!如果您在谈论指针本身,那么是的!在您的程序结束时,指针将被清除!

    【讨论】:

    • 谢谢!这意味着即使在程序关闭后,糟糕的编写代码也会导致计算机速度变慢。有没有freeall();方法或类似的东西可以放在程序的末尾吗?
    • @Mostaguen,没有。这个答案是错误的。你不需要freeall 或类似的东西。当程序结束时,它的内存全部被操作系统回收。
    • @Mostaguen,在某些情况下,最好忘记在最后释放大量此类内存,因为它会使您的应用程序在用户关闭后挂在那里。释放重复分配的内存对于避免内存泄漏很重要,但如果它只分配一次并且恰好相当大,我宁愿关闭应用程序并由操作系统处理它,而不是坐在那里等待应用程序“什么都不做” 10 秒”。
    • 在处理特定的“程序关闭后”状态时,此答案在现代面向用户的操作系统上无效。在某些嵌入式操作系统上,它可能仍然有效,但这是一个非常大的例外,而不是常态。
    • @mah,你知道任何嵌入式操作系统以这种方式运行吗?我认为被称为“操作系统”而不是“执行”或类似的东西需要这种内存管理功能。
    【解决方案2】:

    请注意,需要释放的不是指针,而是指向的对象。

    答案取决于指针指向的内存类型:

    • 如果指针指向自动对象,则隐式清除对象。
    • 如果指针指向使用newnew []malloccalloc 动态分配的对象,则需要通过调用deletedelete []free 显式释放它们。

    请注意,建议谨慎使用动态分配,如果必须,请使用智能指针而不是原始指针。

    编辑:
    如果您的问题是:
    如果您的程序没有释放内存并退出会发生什么?

    答案是:
    操作系统回收它。操作系统只是收回它分配给一个进程的所有内存,它不知道您的程序是否泄漏了内存。
    但是,自己清理自己的烂摊子始终是一种好习惯。
    如果你有一个类的析构函数确实有带有副作用的代码,那么不在动态分配的指针上调用 delete 会导致未定义的行为,它会使你的代码完全悬在编译器的摆布之下。

    【讨论】:

    • 除非他为指针分配内存。但他似乎同时问了三四个问题。这个问题模棱两可。
    • 我不认为这个问题是模棱两可的。它说“当程序关闭时,它们是从内存中删除还是留在那里”,答案是操作系统在进程终止时回收所有使用该进程的内存。
    • 你可以把他写的大部分内容都删掉,然后给他留下那个答案,但是在他句子的前半部分和后半部分之间,还有其他一些尚未解决的问题。这让我相信他还有其他没有直接问过的问题。他专门询问指针本身,这让我觉得这个问题很尴尬。
    【解决方案3】:

    当您的程序结束时,它使用的所有内存(无论是否动态分配)都会返回给操作系统。不管它是 C 程序、C++ 程序、C# 程序还是您可能正在编写的任何其他类型的程序。

    现在,仅仅因为操作系统会回收内存并不意味着您可以对内存管理不屑一顾。当你的程序运行时,你应该尽量释放你已经完成的所有内存。不这样做会导致“内存泄漏”,这些肯定会影响您的程序及其运行的系统,至少在您的程序运行时是这样。

    【讨论】:

    • @MatthieuM。掌上操作系统怎么样? :D
    • 我想,任何基于正交持久性概念的操作系统都会在这样的问题中引入皱纹。
    • 但是不对析构函数产生副作用的类对象调用delete,不仅会导致内存泄漏,还会导致未定义行为,因此根本不建议这样做。
    • @Als,这是真的。我认为 OP 的问题是“如果我的代码中有内存泄漏错误,我会填满计算机上的所有内存吗?”,答案是“不,当你的程序退出时,它使用的内存是由操作系统恢复。”
    • @MatthieuM。 Novell NetWare 就是其中之一。你必须释放一切,我的意思是一切:内存、文件、套接字、信号量……否则它会崩溃。 '它' 是 NetWare。 Windows 3 在这方面也好不到哪里去。
    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2016-03-06
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多