malloc和New中堆中初始化的混淆

Confusion on initialisation in Heap in malloc and New

本文关键字:初始化 New malloc      更新时间:2023-10-16

我在C(malloc)和C++(New)中有以下代码。我很困惑为什么C verison不工作。错误-在分配块之前内存崩溃

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);
}

根据实现细节,mallocnew通常会分配比请求更大的内存段。它们中的每一个都将对应的freedelete所需的信息存储在该附加的存储器中,然后向用户返回指向该存储器之后的存储器的指针。

当调用freedelete时,它们中的每一个都希望在用户请求解除分配的内存地址之前找到所需的信息。如果该信息已损坏(或者在您的示例中是完全无效的),则会调用未定义的行为,此时任何事情都可能发生。

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