Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不删除动态分配的内存,并在程序终止后让操作系统释放_C++_Memory Management_Memory Leaks_Heap Memory - Fatal编程技术网

C++ 不删除动态分配的内存,并在程序终止后让操作系统释放

C++ 不删除动态分配的内存,并在程序终止后让操作系统释放,c++,memory-management,memory-leaks,heap-memory,C++,Memory Management,Memory Leaks,Heap Memory,我读过这个问题和答案 , 我想知道,在程序终止后,不删除动态分配的内存并让操作系统释放内存是否可以。 因此,如果我已经为程序中需要的对象分配了一些内存,那么为了使代码运行更快,可以在程序结束时跳过删除它们吗?简短的回答是可以的,长的回答可能是最好不要这样做:如果您的代码需要重构并转换为库,你向将要做这项工作的人提供了相当数量的技术债务,可能就是你 此外,如果您有一个真实的、难以发现的内存泄漏,而不是由于您故意不释放长寿命对象而导致的内存泄漏,那么使用valgrind对其进行调试将非常耗时,因为存

我读过这个问题和答案 , 我想知道,在程序终止后,不删除动态分配的内存并让操作系统释放内存是否可以。
因此,如果我已经为程序中需要的对象分配了一些内存,那么为了使代码运行更快,可以在程序结束时跳过删除它们吗?

简短的回答是可以的,长的回答可能是最好不要这样做:如果您的代码需要重构并转换为库,你向将要做这项工作的人提供了相当数量的技术债务,可能就是你

此外,如果您有一个真实的、难以发现的内存泄漏,而不是由于您故意不释放长寿命对象而导致的内存泄漏,那么使用valgrind对其进行调试将非常耗时,因为存在大量的噪声和误报


看看std::shared_ptr和std::unique_ptr。后者没有开销。

大多数健全的操作系统会在进程终止时释放进程拥有的所有内存和本地资源。操作系统可能会以懒惰的方式执行此操作,或者减少其共享计数器,但这在这个问题上无关紧要。因此,跳过释放这些资源是安全的

然而,这是一个非常坏的习惯,你几乎一无所获。若您发现释放对象需要很长时间,就像在一个很长的对象列表中行走一样,那个么您应该改进代码并选择更好的算法


同时,OS将释放所有本地资源,但也有例外,比如共享内存和全局空间信号量,它们需要显式地释放它们。

< P>首先,C++中的第一个规则是:

避免动态分配,除非你真的需要它

不要轻易使用新产品;即使它被安全地包装在std::make_unique或std::make_shared中也不行。在C++中创建一个类型实例的标准方法是:

T

<>在C++中,只有当对象应该超出它最初创建的范围时,才需要动态分配。 <>当且仅当您需要动态分配一个对象时,考虑使用STD::SysDypPTR或STD::UnQuyQPTR。当对象不再需要时,这些将自动解除分配

第二,

是否可以在节目结束时按顺序跳过删除它们 让代码运行得更快

绝对不是,因为这是为了让代码运行得更快的一部分。这将是过早的优化

这些是基本要点

然而,您仍然必须考虑什么构成真正的或错误的内存泄漏。 这是一个严重的内存泄漏:

#include <iostream>

int main()
{
    int count;
    std::cin >> count;
    for (int i = 0; i < count; ++i)
    {
        int* memory = new int[100];
    }
}
void OnButtonClicked()
{
    std::string* s = new std::string("my"); // evil!
    label->SetText(*s + " label");
}
这段虚构的、稍微做作的代码将使内存消耗随着每次按钮点击而增加。程序运行的时间越长,占用的内存就越多

现在将其与:

int main()
{
    int* memory = new memory[100];
}
在这种情况下,内存消耗是恒定的;它不依赖于用户输入,并且不会随着程序运行时间的延长而变大。虽然对于这样一个微小的测试程序来说是愚蠢的,但是C++中有一些故意不进行分配的情况是有意义的。p> 我想到了单身汉。在C++中实现Singleton的一个非常好的方法是动态创建实例并且永远不删除它;这避免了所有销毁顺序问题,例如设置Manager在日志已销毁时写入其析构函数中的日志。当操作系统清除内存时,不再执行代码,您就安全了


很有可能你永远不会遇到这样的情况:避免交易是个好主意。但是要谨防软件工程中的规则,尤其是C++。良好的内存管理比将每个新内存与删除匹配要困难得多。

这不是一个好的做法,当大量内存未被删除时,可能会导致意外行为。如果您不想管理自己,请使用boost::unique\u ptr。它会被自己删除。听起来使用垃圾收集语言会让你更开心,但你可能正在使用动态内存分配,而实际上你并不需要。@crashmstr:确实如此。释放动态分配真的需要那么多时间吗?我只是好奇,谢谢你的回答!因此,不释放动态分配的内存是一种不好的做法。我会读到关于共享和独特的内容。什么!!!避免使用动态内存?你到底在推荐什么?你必须这样做的唯一原因是不知道如何使用它。Java完全基于动态内存。你在说什么?抱歉,只能投你反对票。@LuisColorado:Java是另一种语言。你正在争论一个公认的、普遍接受的C++指南。你的主张有权威的来源吗?“除非你真的需要它”确实很常见。更不用说生命周期和所有权了
ce是有限的,如果你有大量的数据,你最终需要解决动态分配问题,或者让其他人在某种收集中为你解决。@Calvin:好吧,显然当我反对不必要的动态分配时,我不打算避免STD::vector。我反对初学者在C++中更新所有的错误,只是因为java有垃圾收集:智能指针有点减轻了这个问题,但是没有解决它。@加尔文:你需要动态分配的频率主要取决于你的应用程序域。无论如何,这应该是一个简洁的选择,而不是默认的选择。