C++ new 内存开辟 & 构造函数

以前一直以为是由C++构造函数完成内存开辟的。

C++ 一个空内,它会默认生成一些函数,以前是4个,现在可能更多了...

class Student {
//...
};

C++ 一般有两种生成对象的方法:一种是在堆上new一个对象,另一种是在栈上定义一个对象。堆上的空间由程序员自己管理,栈上的空间由系统负责维护。

我以前看了《深入探索C++对象模型》一本书,它说只有在编译器需要的时候才会产生有用的构造函数、其他情况下产生的构造函数是有用的。我一度有以下几种误解或疑惑: [x] 在编译器不需要构造函数的情况下,就不会生成构造函数。 [x] 内存是由构造函数开辟的。 [?] 既然,没有构造函数,为什么可以定义类对象呢?

后来,我猜明白了,new / delete是C++的关键字,它和malloc / free 是由区别的。主要表现在,以上的两种写法会被编译器更改为:

  • 这就解释了,产生一个类时,首先是根据类的size来开辟空间,之后才调用构造函数,而且也明白了类成员函数第一个参数为隐式的this指针。

    Student* s;
    if (s = __new(sizeof(Student)))
    s = Student::Student(s);

  • 同样也分为了两步。第一步在栈上开辟了空间,第二步还是会显示调用构造函数。

    Student s;
    s.Student::Student();

References:

[1]《深度探索C++对象模型》 侯捷 译