std :: malloc可以创建一个对象吗?是否始终需要新的位置?

时间:2018-02-07 19:41:13

标签: c++ language-lawyer

此代码在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)       如果对象具有非空的初始化,则其初始化完成,

     

除非对象是工会成员或其子对象......

source

我相当肯定这句话可以回答我的问题,但我不能很好地理解它是否说是或否。

1 个答案:

答案 0 :(得分:-2)

您的对象的类型为int,并不需要进行非平凡的初始化,因此只需调用std::malloc即可满足两个要点。

如果对象需要一个非平凡的构造函数调用,那么new是满足(1.2)的方法,如果你想使用除operator new()以外的分配器,那么placement new是正确的方法