Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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+中的内存泄漏+;;忘记做免费的,删除 我们使用MALLC和C++在内存中使用新的内存分配内存。我知道必须分配内存 在C中自由释放或返回操作系统,并在C++中删除。 如果我在分配内存后忘记使用free/delete,这意味着将出现内存泄漏 valgrind --leak-check=full ./compiled_binary_C++_C - Fatal编程技术网

C,C+中的内存泄漏+;;忘记做免费的,删除 我们使用MALLC和C++在内存中使用新的内存分配内存。我知道必须分配内存 在C中自由释放或返回操作系统,并在C++中删除。 如果我在分配内存后忘记使用free/delete,这意味着将出现内存泄漏 valgrind --leak-check=full ./compiled_binary

C,C+中的内存泄漏+;;忘记做免费的,删除 我们使用MALLC和C++在内存中使用新的内存分配内存。我知道必须分配内存 在C中自由释放或返回操作系统,并在C++中删除。 如果我在分配内存后忘记使用free/delete,这意味着将出现内存泄漏 valgrind --leak-check=full ./compiled_binary,c++,c,C++,C,现在,我的问题是,这个内存泄漏只是在程序执行期间发生的吗;或者是永久性泄漏/损失,还是在重启系统后再次获得?内部过程究竟是什么?内存泄漏/丢失的确切含义是什么 如果有人能详细解释这一点或提供一些好的参考资料,我将非常感激 更新1 在阅读了一些答案后,我了解到程序终止后内存会返回给操作系统/系统,如果是这样,为什么每个人都需要如此关注内存泄漏,为什么防止内存泄漏非常重要 更新2 所以,应该防止内存泄漏,这样系统就不会因为没有足够的内存进行分配而崩溃 更新3 所以,在阅读了所有答案后,我意识到内存泄

现在,我的问题是,这个内存泄漏只是在程序执行期间发生的吗;或者是永久性泄漏/损失,还是在重启系统后再次获得?内部过程究竟是什么?内存泄漏/丢失的确切含义是什么

如果有人能详细解释这一点或提供一些好的参考资料,我将非常感激

更新1

在阅读了一些答案后,我了解到程序终止后内存会返回给操作系统/系统,如果是这样,为什么每个人都需要如此关注内存泄漏,为什么防止内存泄漏非常重要

更新2

所以,应该防止内存泄漏,这样系统就不会因为没有足够的内存进行分配而崩溃

更新3

所以,在阅读了所有答案后,我意识到内存泄漏是防止系统崩溃的重要问题。但是,对于像我这样的初学者,我如何确定我的程序是否完全没有内存泄漏。如果我使用malloc,我会尝试做free,delete,new,但有时会变得混乱。有没有什么工具或方法可以让我知道我的程序是否有内存泄漏

更新4

在阅读了答案之后,我现在已经理解了无内存泄漏代码的重要性,更少地使用new/delete,更多地使用STL,学习了RAII、valgrind等新知识以及良好的编程实践。 感谢所有人:)

这是每个进程。一旦进程退出,分配的内存将返回操作系统供其他进程(新的或现有的)使用

要回答您编辑过的问题,您的机器内存有限。因此,如果您有内存泄漏,那么主要的问题是内存不可供其他进程使用。第二个但不可忽略的影响是,进程映像将增长,您将切换到光盘,性能将受到影响。最后,您的程序将耗尽系统中的所有内存并失败,因为它无法为自己分配任何内存

有争议的是,对于一个生命周期很短的小进程,内存泄漏是可以容忍的,因为泄漏的内存数量很小,寿命很短


看看,可能比你需要的更多的信息。我们在这里讨论的是动态或堆分配。

操作系统将跟踪内存,一旦程序终止,将回收所有内存。这只意味着应用程序丢失了一些分配的内存


请注意,这可能不适用于某些操作系统,但适用于任何windows/unix/mac类型的系统。它是分配给进程的内存。当您终止进程时,您将得到它。

这是内存泄漏

valgrind --leak-check=full ./compiled_binary
基本上,这意味着在进程被销毁之前,这些内存不会被回收

问题是,当指针超出范围而您没有释放内存时,它将由进程分配,但程序无法知道它超出范围且不再需要(不使用Valgrind之类的工具)


如果反复发生,这只是一个主要问题。如果它这样做了,那么程序在最终崩溃之前运行的时间越长,它将继续使用越来越多的内存。用户需要定期重新启动应用程序,以避免发生这种情况或使用过多的系统资源。

内存泄漏通常会导致长时间运行的程序出现问题;在循环等不合适的地方泄漏几个字节会迅速扩大应用程序的内存占用。

内存不会丢失,但会保持已分配状态,因此无法用于程序的下一次分配。 这意味着,如果您的程序继续分配内存而不释放内存,那么它将消耗越来越多的内存。 一段时间后,会有未分配的内存剩余,下一次分配新内存的尝试将失败,因此您的程序会失败

该内存取自所谓的“堆”。它是程序本地的,在程序完成时将被完全删除。 因此,您的程序可能对系统和操作系统中运行的其他程序造成的“唯一”危害是,它们也可能无法分配内存,因为您的程序已经“耗尽”了所有内存。一旦您终止您的程序,如果其他人在此期间没有因为分配问题而崩溃,他们应该会正常运行。

回答编辑问题-

如果您的程序打算运行,。所以有些东西,然后终止,然后不,你不需要太担心释放内存。这对于运行一段时间的程序很重要。如果您的web浏览器没有释放用于显示页面的内存,它将很快使用计算机中的所有内存


无论如何,释放内存是一种很好的做法,曾经运行过的小程序有被转换成其他东西的习惯,这是一种很好的习惯。

监视内存泄漏的工具是覆盖新的和删除操作符。这允许您维护已分配但未释放的内存列表。因此,如果某个特定对象应该释放了它正在使用的所有内存,则此机制为您提供了一种方法来验证它是否确实释放了内存。

有一些工具可以检测内存泄漏,例如..

Re:检测内存泄漏的工具

如果使用基于Linux的操作系统进行开发,可以尝试使用valgrind()检测内存泄漏

valgrind --leak-check=full ./compiled_binary
如果您的程序是使用调试符号编译的(例如,对于gcc,包括-g标志),valgrind还将通知您泄漏内存分配的确切代码行。这将大大简化跟踪和修复泄漏的任务

优点:它是fre
struct MemoryAllocEntry
{
    char* pFile;
    char* pLine;
};

extern std::map< MemoryAllocEntry > g_AllocList;

inline void* MyMemAlloc( size_t size, char* pFile, char* pLine )
{
    MemoryAllocEntry mae;
    void* pRet = malloc( size );
    mae.pFile = pFile;
    mae.pLine = pLine;

    g_AllocList[pRet] = mae;

    return pRet;
}

inline void MyMemFree( void* pPtr )
{
    std::map< MemoryAllocEntry >::iterator iter = g_AllocList.find( pPtr );
    if ( iter != g_AllocList.end() )
    {
         g_AllocList.erase( iter );
    }
    free( pPtr );
}

#ifdef _DEBUG
    #define malloc( x ) MyMemAlloc( (x), __FILE__, __LINE__ )
    #define free( x ) MyMemFree( (x) )
#endif