此代码在C ++中是否有未定义的行为?
#include <cstdlib>
int main() {
int *ip = static_cast<int *>(std::malloc(sizeof *ip));
*ip = 42; //is this accessing an object that has not started its lifetime?
free(ip);
}
注意:
std::malloc
has the semantics that it has in C。在C std::malloc
中创建有效的int
,所以它应该有效吗?
对象或引用的生命周期是的运行时属性 对象或参考。据说一个物体是非空的 初始化,如果它是类或聚合类型和它或其中之一 它的子对象由一个非常重要的构造函数初始化 默认构造函数。 [注意:通过简单的复制/移动进行初始化 构造函数是非空的初始化。 - 结束说明]一生 类型为T的对象在以下时间开始:
(1.1) 获得具有适当对齐和尺寸的类型T的存储,并且
(1.2) 如果对象具有非空的初始化,则其初始化完成,除非对象是工会成员或其子对象......
我相当肯定这句话可以回答我的问题,但我不能很好地理解它是否说是或否。
答案 0 :(得分:-2)
您的对象的类型为int
,并不需要进行非平凡的初始化,因此只需调用std::malloc
即可满足两个要点。
如果对象需要一个非平凡的构造函数调用,那么new
是满足(1.2)的方法,如果你想使用除operator new()
以外的分配器,那么placement new是正确的方法