内存泄漏在C /内存分配++

问题描述:

我在C++下面的函数内存泄漏在C /内存分配++

void func1() 
{ 
    char *p = "Test for memory leak"; 
} 

func1()被称为其中该变量的存储器分配的?无论是在堆栈还是堆?应该明确调用delete p;吗?

不,内存仅分配给堆栈上的指针p。该内存在p超出范围时自动回收。 p只是指向一个字符串,它存储在程序的只读部分中的某处。理想情况下,它应该被定义为const char *p。如果您尝试delete它,它将是未定义的行为。通常,您可以记住,每拨打new,都需要拨打delete

+5

+1 char const * p - 强制指针只读是好行为,因为它反映了指针的意图 - 是只读的。 – 2009-11-30 10:02:56

+0

.. *咳嗽*我的意思是指针指向只读内存。指针本身不是恒定的。 – 2009-11-30 10:23:43

字符串文字的内存分配在静态存储中,分配持续时间是整个程序运行时间。你不应该调用delete - 调用delete会导致未定义的行为。

字符串文字通常位于可执行文件的只读文本段中。调用free/delete会导致不好的事情。

根本没有内存泄漏。如果您查看编译后的代码,则字符串Test for memory leak\0实际上是可执行程序的一部分 - 并且加载程序会在执行过程中将其复制到内存中。程序终止后,操作系统清除这个预先加载的内存。

变量*p本身在函数被调用时被分配在堆栈上,当函数返回指针从堆栈中被移除时。

delete需要使用new调用分配的内存(仅适用于从堆中获取的内存)。

new和new []运算符用于在C++堆中明确分配内存。

规则是
1.呼叫delete为每new运营商使用
2.呼叫delete[]每使用new[]操作。

其余的一切都在栈上,不应该明确地释放它。它会自动被照顾。

遵循此规则,您不会出错。

虽然,请注意,如果您在循环中使用new并在其外部使用delete,它会导致大的内存泄漏。

最佳做法是使用智能指针,当指针超出范围时,智能指针会自动为您分配内存。 Boost库为此提供了一些不错的选择。了解更多关于在这里:​​http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/smart_ptr.htm

--Samrat帕蒂尔

的函数定义一个指针p,这是设置为指向静态分配的字符串"Test for memory leak"

什么都不是动态分配的,所以没有必要手动释放。

您应该始终将呼叫配对到newdelete。当new编辑时,它必须是deleted,反之亦然。

就你而言,字符串本身是静态的,并持续到程序终止。 而p是堆栈上的局部变量,它持续到函数返回。

所以这两个都由系统自动处理。

为了确切知道是否有泄漏,可以使用调试器。我喜欢使用deleaker。有了它,你可以知道什么时候有泄漏。并知道哪里泄漏很容易删除。