You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中未初始化内存赋值合法性、适用类型及placement new必要性问询

malloc分配内存后直接赋值的C++合法性分析

代码合法性与行为判定

你给出的这段代码:

int* i = static_cast<int*>(std::malloc(sizeof(int)));
*i = 123;

在C++中是合法的,不会触发未定义行为或实现定义行为——前提是std::malloc成功分配了内存(返回值非空),且内存满足int的对齐要求(malloc默认保证标准类型的对齐)。

适用类型范围

这种直接赋值的操作仅适用于平凡类型(trivial type),具体包括:

  • 所有基本数据类型(如int、char、float、bool等)
  • 仅包含平凡类型的聚合类型(比如无自定义构造/析构/赋值运算符、无虚函数的普通结构体)
  • 符合C++标准定义的其他平凡类型(无用户声明的构造函数、无虚函数/虚基类、所有非静态成员均为平凡类型等)

是否必须使用placement new?

  • 对于int这类平凡类型,不需要必须使用new(i) int (123);。直接赋值和placement new的效果完全等价,都能正确完成内存中对象的初始化。
  • 但对于非平凡类型(比如拥有自定义构造函数、析构函数、虚函数的类),必须使用placement new显式构造对象。如果跳过构造直接调用operator=,会触发未定义行为——因为此时内存中不存在合法构造的对象,赋值操作的前置条件不满足。

内容的提问来源于stack exchange,提问作者tmlen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:31:04