这个C ++析构函数是多余的吗?
我已经收到了一些C ++代码,其结构如下所示:
typedef struct _someStruct_ { std::string someString; std::vector<std::string> someVectorOfStrings; int someOtherStuff; ~_someStruct_() { someString.clear(); someVectorOfStrings.clear(); } } someStruct;
这里的析构函数完全是多余的 – 如果结构被缺省的析构函数破坏,那么不会有任何string,向量等被破坏吗?
如果我编写代码,我不会想到在这里添加一个显式析构函数 – 我只是让编译器继续。
据我所知,唯一可能需要在结构中创build自己的析构函数的是,如果结构中的任何成员包含指向可能需要清理的数据的指针,或者是某些额外的function(例如debugging,一个结构被删除)是需要的。
我在这里错过了什么 – 有什么理由为什么string和向量已经在析构函数中明确清除? 我怀疑发送给我的人真的是C程序员(比如typedef),他试图把一些C代码转换成C ++。
是的,析构函数是完全多余的。
正如你所说的,代码还有其他的警告标志。 在C ++中使用typedef struct
是没有任何意义的,它和空的析构函数一样多余:代码是由C ++边缘掌握的人编写的,一定会有更多的陷阱(一方面,类名是无效的由于全球领先的下划线)。
事实上,这比单纯使用隐式析构函数更糟糕 。
通过显式析构函数,编译器不会为您提供隐式的移动构造函数!
析构函数几乎完全是多余的。
它有三件事。
首先,它阻止复制/移动构造函数和赋值的自动创build。 这可能不是一件好事。 但也许这是理想的。 然而,这与不在那里是不一样的。
其次,它改变了东西被清理的顺序。由string保存的缓冲区被清除,然后在向量中的string所持有的每个缓冲区被销毁,而持有它们的string被销毁,然后带有未被使用的缓冲区的向量内存被破坏(返回内存),那么现在空的string被销毁。
使用默认析构函数时,顺序是vector的string的缓冲区被销毁,则向量的string的内存被返回,而vector被销毁, 然后string与其缓冲区一起被销毁。
你可以通过适当的重载来检测这个操作符new
和delete
,或者如果你使用自定义的分配器。
最后,这样的析构函数有时可以更容易debugging,因为你可以通过它们。
然而,这些可能性并不在于编写该代码的开发人员所期望的这些微妙的效果。