为什么用malloc开辟对象空间初始化后对象立马就执行了析构函数?

请问为什么在执行完构造方法后析构函数就立马被调用了?

img

如果arr中的对象被释放了【指的是析构函数成功执行了】,为什么打印arr的值时和初始化部分赋值一致?

/***********************************
* 控制台输出
***********************************/

析构函数,Data.a = 0
析构函数,Data.a = 1
析构函数,Data.a = 4
析构函数,Data.a = 9
析构函数,Data.a = 16
arr[0]=0
arr[1]=1
arr[2]=4
arr[3]=9
arr[4]=16

Process finished with exit code 0

代码:

/***********************************
* main.cpp
***********************************/
#include <iostream>
#include "Data.h"

using namespace std;

int main() {
    const int count = 5;
    Data *arr = (Data *) malloc(count * sizeof(Data)); // 为Data对象数组arr开辟空间
    for (int i = 0; i < count; i++) arr[i] =  Data(i * i); // 为arr初始化
    for (int i = 0; i < count; i++) printf("arr[%d]=%d\n", i, arr[i].getA()); // 打印arr的值
    return 0;
}
/***********************************
* Data.cpp
***********************************/
#include <iostream>
#include "Data.h"

int Data::getA() const {
    return a;
}

void Data::setA(int a) {
    Data::a = a;
}

Data::~Data() {
    std::cout << "析构函数,Data.a = " << getA() << std::endl;
}

Data::Data(int i) {
    Data::a = i;
}
/***********************************
* Data.h
***********************************/
#ifndef LEARN_DATA_H
#define LEARN_DATA_H


class Data {
private:
    int a;
    int b;
public:
    int getA() const;

    void setA(int a);

    ~Data();

    Data(int i);
};


#endif //LEARN_DATA_H

我觉得是第9行for下的 赋值语句,Data()作为右值相当于是临时创建的Data对象,出第9行的for区域自然临时对象就释放了。

修改说明如下,供参考:

/************************************
* main.cpp
***********************************/
//#include <iostream>
//#include "Data.h"
//using namespace std;
int main() {
    const int count = 5;
    Data* arr = (Data*)malloc(count * sizeof(Data)); // 为Data对象数组arr开辟空间
    //for (int i = 0; i < count; i++) arr[i] = Data(i * i);// 为arr初始化,这句是用构造函数Data(i * i);生成一个临时对象给arr[i]赋值,
                                                           // 赋值完成后系统会销毁这个临时对象,所以调用析构函数。
                                                             
                                                           // 所谓对象初始化,是在定义对象时,同时用构造函数给对象赋值,但这里用
                                                           // malloc()为Data对象数组arr开辟空间时,并没有用到构造函数,
    for (int i = 0; i < count; i++) arr[i].setA(i * i);    // 所以要给数组arr[]数组各元素赋值,可以利用成员函数void setA(int a);
    for (int i = 0; i < count; i++) printf("arr[%d]=%d\n", i, arr[i].getA()); // 打印arr的值
    return 0;
}