对 delete 和 shared_ptr 的行为 这么理解正确吗?

2022-01-11 23:43:43 +08:00
 amiwrong123
#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;一样。

各位大佬看下我的理解对吗

1525 次点击
所在节点    C++
5 条回复
wevsty
2022-01-12 00:05:26 +08:00
没有 double[] 的析构函数这种玩意。
对于内置类型 delete 和 delete [] 的行为没有区别,都是直接释放内存。
如果是 class 类型,delete [] 会调用数组里每个元素的析构函数,然后再释放内存。
wevsty
2022-01-12 00:07:22 +08:00
另外 double* 不一定是占用 4 字节,比如 X64 下面就是 8 字节。
wevsty
2022-01-12 00:16:51 +08:00
查了一下,说错了,更正一下:
operator delete[] 是有的,并且可以重载。
mingl0280
2022-01-12 09:25:52 +08:00
前面那个我是被整怕了,可以用宏打出来看一看。
后面那个嘛……首先,double 是 POD ,所以它的 delete[]会遍历所有数组项然后释放内存,该操作因为是 POD 所以没有析构——肯定是走的全局的那个 operator delete 。
如果你的"double"并不是一个 POD 的东西,那么这个东西会调用这个东西内的 operator delete[],这个有。
amiwrong123
2022-01-12 10:01:52 +08:00
@mingl0280
delete[]会遍历所有数组项然后释放内存

感觉这次遍历好像做了一次无用功呢,也没有析构函数可以调

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827700

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX