我在C(malloc)和C ++(New)中有以下代码。我很困惑为什么C版本无效。 错误- 在分配块之前被破坏的内存
Exited: ExitFailure 127.
这样做有什么问题。
C ++版本
#include <iostream>
using namespace std;
int main()
{
char *p=new char[20];
strcpy(p,"Hello");
p=(char*)"Hi";
cout<<p;
delete p;
}
C版
#include <stdio.h>
# include <malloc.h>
# include <string.h>
int main()
{
char *p=(char*)malloc(50);
strcpy(p,"Hello");
p=(char *)"Hi";
printf("%s",p);
free(p);
}
答案 0 :(得分:1)
根据实现细节,malloc
和new
通常会分配比请求更大的内存段。它们中的每一个都在相应的内存中存储相应free
和delete
所需的信息,然后向用户返回指向后那段内存的指针
当调用free
和delete
时,每个人都希望在用户请求解除分配的内存地址之前找到所需的信息。如果该信息已损坏(或在您的示例中 - 完全无效),则会调用未定义的行为,此时可能会发生任何事情。
答案 1 :(得分:1)
char *p=(char*)malloc(50); // you allocate p
strcpy(p,"Hello"); // you change the p's value in legal way
// here should be free(p)
p=(char *)"Hi"; // YOU OVERWRITE p, YOU CAN'T FREE IT AFTER THAT LINE
printf("%s",p); //
free(p); // this line should be removed
此外:
char *p=new char[20];
strcpy(p,"Hello");
/*here should be delete[] p, not delete p, it deletes only 1 element
*you allocated 20
*/
p=(char*)"Hi";
cout<<p;
delete p; //this line should be removed