我的C++程序有一个错误:
#include<iostream>
using namespace std;
char* foo()
{
char * mystr = new char[6];
mystr = "Hello";
return mystr ;
}
int main()
{
char* myString =foo();
printf("%s \n", myString);
delete [] myString ;
}
==27472== Invalid free() / delete / delete[]
==27472== at 0x4A07A12: operator delete[](void*) (vg_replace_malloc.c:409)
==27472== by 0x4007EB: main (printHello.cpp:16)
==27472== Address 0x4008f8 is not stack'd, malloc'd or (recently) free'd如果我删除delete [] myString ;,它会工作得很好。
我应该释放堆上分配的内存,对吗?
但是,为什么我得到了错误,如果我删除它。
谢谢
发布于 2011-10-21 06:24:43
因为您正在删除未分配的内存。您通过"new“分配了6个字节,但是您将var "mystr”重新分配给了一个完全不同的指针(静态字符串"Hello"),该指针不是由"new“分配的。因此,您尝试“删除”不是您首先分配的静态字符串"Hello“。修复方法如下:
更改以下行:
char * mystr = new char[6];
mystr = "Hello"; 要这样做:
char * mystr = new char[6];
strcpy(mystr, "Hello");或者,您可以让"foo“只返回”“;”,而不删除main中的字符串。
发布于 2011-10-21 06:25:18
myString不是在堆上分配的-- foo在堆上分配了一个字符数组,但是您随后丢弃了指向它的指针,并返回一个指向静态字符串(不在堆上)的指针。
https://stackoverflow.com/questions/7842968
复制相似问题