我收到了一些C ++代码,其中包含各种结构:
typedef struct _someStruct_ {
std::string someString;
std::vector<std::string> someVectorOfStrings;
int someOtherStuff;
~_someStruct_()
{
someString.clear();
someVectorOfStrings.clear();
}
} someStruct;
这里的析构函数是完全冗余的 - 如果结构要被默认的析构函数破坏,那么任何字符串,向量等都会被破坏吗?
如果我编写了代码,我就不会想到在这里添加一个显式的析构函数 - 我只是让编译器继续使用它。
据我所知,你可能需要在结构中创建自己的析构函数的唯一时间是结构的任何成员是否包含指向可能需要清理的数据的指针,或者是否有一些额外的功能(例如用于调试) ,需要记录何时删除结构。
我在这里遗漏了什么 - 有没有理由在析构函数中明确清除字符串和向量?我怀疑发送给我的人是C程序员(参见typedef),他试图将一些C代码转换成C ++。
答案 0 :(得分:70)
是的,析构函数完全是多余的。
正如你自己所说,代码中还有其他警告标志。例如,使用typedef struct
在C ++中没有任何意义,它与空的析构函数一样多余:代码是由对C ++边缘掌握的人编写的,必然会有更多的陷阱(一方面,类由于全局范围中的前导下划线,名称无效。
答案 1 :(得分:50)
事实上,这比仅仅使用隐式析构函数 更糟 。
通过使用显式析构函数,编译器不会为您提供隐式移动构造函数!
答案 2 :(得分:21)
析构函数几乎完全是多余的。
它做了三件事。
首先,它阻止自动创建复制/移动构造函数和赋值。这......可能不是一件好事。但也许是理想的。然而,与不在那里不一样。
其次,它改变了清理内容的顺序。字符串保存的缓冲区被清除,然后向量中的字符串保存的每个缓冲区被破坏,而保存它们的字符串被破坏,然后带有一个字符串的向量未使用内存的缓冲区被破坏(返回内存),然后现在空的字符串被破坏。
使用默认的析构函数,顺序是向量的字符串的缓冲区被销毁,然后在向量被销毁时返回向量的字符串的内存,然后< / strong>字符串将被销毁,并返回其缓冲区。
您可以通过适当的重载来检测此操作符new
&amp; delete
,或者如果您使用自定义分配器。
最后,这些析构函数有时可以更容易调试,因为您可以逐步完成它们。
然而,可能的是,编写该代码的开发人员不会想到这些微妙的影响。