我在C ++中有以下功能
void func1()
{
char *p = "Test for memory leak";
}
调用func1()
时,分配的变量的内存在哪里?无论是在堆栈还是堆中?应该明确调用delete p;
吗?
答案 0 :(得分:15)
字符串文字的内存在静态存储中分配,分配持续时间用于整个程序运行时间。你不应该调用delete - 调用delete会导致未定义的行为。
答案 1 :(得分:10)
不,内存仅分配给堆栈上的指针p
。 p
超出范围时,将自动回收此内存。 p
只是指向一个字符串,该字符串存储在程序的只读部分中的某些位置。理想情况下,它应定义为const char *p
。如果您尝试delete
它,它将是未定义的行为。通常,您可以记住,每次拨打new
时,都需要拨打delete
答案 2 :(得分:4)
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 Patil
答案 3 :(得分:2)
为了确切知道是否存在泄漏,您可以使用调试器。我喜欢使用deleaker。有了它你就可以知道什么时候有泄漏。并且知道泄漏的位置很容易消除。
答案 4 :(得分:1)
根本没有内存泄漏。如果查看已编译的代码,字符串Test for memory leak\0
实际上是可执行程序的一部分 - 并且加载程序将在执行期间将其复制到内存中。程序终止时,操作系统会清除此预加载的内存。
当调用函数时,变量*p
本身在堆栈上分配,当函数返回时,指针将从堆栈中删除。
答案 5 :(得分:1)
该函数定义了一个指针p
,它被设置为指向静态分配的字符串"Test for memory leak"
。
没有动态分配任何内容,因此不必手动释放任何内容。
您应始终将来电与new
和delete
配对。当某些内容为new
时,它必须为deleted
,反之亦然。
在您的情况下,字符串本身是静态的,并持续到程序终止。
p
是堆栈上的局部变量,它会持续到函数返回。
所以这两个都是由系统自动处理的。
答案 6 :(得分:0)
字符串文字通常位于可执行文件的只读文本段中。在他们身上调用免费/删除可能会导致不好的事情。
答案 7 :(得分:0)
delete
需要调用使用new
分配的内存(仅适用于从堆中获取的内存)。