#include <iostream>
#include <memory>
using namespace std;
class Line
{
public:
Line(double len, int a); // 这是构造函数声明
~Line(); // 这是析构函数声明
private:
double length;
double* nums;
};
Line::Line(double len, int a)
{
length = len;
nums = new double[a];
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
delete [] nums;
cout << "Object is being deleted" << endl;
}
int main() {
Line* line = new Line(1.0, 2);
delete line;
{
shared_ptr<Line> aaa = make_shared<Line>(1.0, 2);
}
return 0;
}
我对这个程序的理解如下:
delete line;将做出以下动作:
shared_ptr<Line> aaa
局部变量做的事情和delete line;
一样。
各位大佬看下我的理解对吗
1
wevsty 2022-01-12 00:05:26 +08:00
没有 double[] 的析构函数这种玩意。
对于内置类型 delete 和 delete [] 的行为没有区别,都是直接释放内存。 如果是 class 类型,delete [] 会调用数组里每个元素的析构函数,然后再释放内存。 |
2
wevsty 2022-01-12 00:07:22 +08:00
另外 double* 不一定是占用 4 字节,比如 X64 下面就是 8 字节。
|
3
wevsty 2022-01-12 00:16:51 +08:00
查了一下,说错了,更正一下:
operator delete[] 是有的,并且可以重载。 |
4
mingl0280 2022-01-12 09:25:52 +08:00
前面那个我是被整怕了,可以用宏打出来看一看。
后面那个嘛……首先,double 是 POD ,所以它的 delete[]会遍历所有数组项然后释放内存,该操作因为是 POD 所以没有析构——肯定是走的全局的那个 operator delete 。 如果你的"double"并不是一个 POD 的东西,那么这个东西会调用这个东西内的 operator delete[],这个有。 |
5
amiwrong123 OP |