关于malloc和New中Heap初始化的困惑

时间:2014-08-30 16:45:49

标签: c++ c

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 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