【发布时间】:2011-02-28 14:41:05
【问题描述】:
我知道使用 new 分配的内存,在堆中获取它的空间,所以我们需要在程序结束之前删除它,以避免内存泄漏。
让我们看看这个程序...
Case 1:
char *MyData = new char[20];
_tcscpy(MyData,"Value");
.
.
.
delete[] MyData; MyData = NULL;
Case 2:
char *MyData = new char[20];
MyData = "Value";
.
.
.
delete[] MyData; MyData = NULL;
在情况 2 中,它不是为堆内存分配值,而是指向一个字符串字面量。
现在,当我们执行删除操作时,它会崩溃,正如预期的那样,因为它没有尝试删除堆内存。 有没有办法知道指针指向堆或堆栈的位置?
程序员就是这样
- 不会尝试删除任何堆栈内存
- 他可以调查为什么这个最初指向堆内存的指针会引用本地文字?中间的堆内存怎么了?它是否被另一个指针指向并在其他地方删除等等?
【问题讨论】:
-
你很幸运在第一种情况下没有崩溃——你使用的是
delete而不是delete[](或者更好的是std::string)。 -
@avakar:我宁愿说他不走运——使用
delete而不是delete[]是未定义的行为,具有无限的后果。除非对实现进行非常仔细的检查,否则没有人确切知道会发生什么。即使在那之后,代码也无法移植。 -
@avakar:很抱歉。我直接输入了。现在我已经改变了。感谢您指出。
-
我必须保持我的咆哮:你为什么不使用
std::string? -
@avakar:这只是一个旨在说明问题的示例。
标签: c++ heap-memory stack-memory