malloc和New中堆中初始化的混淆
Confusion on initialisation in Heap in malloc and New
我在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);
}
根据实现细节,malloc
和new
通常会分配比请求更大的内存段。它们中的每一个都将对应的free
和delete
所需的信息存储在该附加的存储器中,然后向用户返回指向该存储器之后的存储器的指针。
当调用free
和delete
时,它们中的每一个都希望在用户请求解除分配的内存地址之前找到所需的信息。如果该信息已损坏(或者在您的示例中是完全无效的),则会调用未定义的行为,此时任何事情都可能发生。
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
相关文章:
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 使用复制构造函数初始化 new[]
- 如何在堆上初始化线程?(使用 "new" 关键字)
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 使用可变模板列表初始化数组,并放置new
- 我可以从取消引用"new"的返回值初始化引用吗
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 构造函数不会将使用 new 初始化的数组作为参数
- 如何在不使用 new 的情况下进行默认初始化
- 为什么"new"在类初始化中失败
- 访问和打印用 new 初始化的矢量的矢量
- 如果在没有 new 运算符的情况下初始化,C++是否将类对象视为值类型
- 视觉效果如何使用New New初始化一个智能点
- new[] 是否初始化内置数组
- 断言错误,即使在使用 new 初始化字符指针后也是如此
- C++对象初始化,无需 new 关键字并使用指针
- 可以直接初始化向量<字符串 *> 而不使用 new 吗?
- 如何在 new[] 的值初始化中使用变量