请问为什么在执行完构造方法后析构函数就立马被调用了?
如果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;
}