这个C++析构函数是多余的吗



我收到了一些C++代码,其中定义了各种结构,如下所示:

typedef struct _someStruct_ {
   std::string someString; 
   std::vector<std::string> someVectorOfStrings;
   int  someOtherStuff;
   ~_someStruct_()
   {
      someString.clear();
      someVectorOfStrings.clear(); 
   }
} someStruct; 

这里的析构函数是完全冗余的吗?如果结构由默认的析构因子进行析构函数,那么任何字符串、向量等都不会被析构函数吗?

如果我写了代码,我就不会想到在这里添加显式析构函数——我只会让编译器继续做下去

据我所知,在结构中创建自己的析构函数的唯一时间是,结构的任何成员是否包含指向可能需要清理的数据的指针,或者是否需要一些额外的功能(例如,在删除结构时进行调试和日志记录)。

我是不是遗漏了什么?字符串和向量在析构函数中被明确清除有什么原因吗?我怀疑发给我这封信的人实际上是一个C程序员(参见typedef),他试图将一些C代码转换成C++。

是的,析构函数是完全冗余的。

正如您自己所说,该代码还有其他警告标志。例如,在C++中使用typedef struct毫无意义,它就像空的析构函数一样冗余:代码是由对C++掌握不多的人编写的,肯定会有更多的gotchas(首先,由于全局范围中的前导下划线,类名无效)。

事实上,这比简单地使用隐式析构函数更糟糕。

通过具有显式析构函数,编译器将不会为您提供隐式移动构造函数!

析构函数几乎是完全冗余的。

它做了三件事。

首先,它阻止了复制/移动构造函数和赋值的自动创建。这这可能不是一件好事。但也许这是可取的。然而,这与不在那里是不一样的。

第二,它改变了清理东西的顺序。字符串所保持的缓冲区被清除,然后向量中字符串所持有的每个缓冲区被销毁,而保持它们的字符串被销毁,然后带有未使用内存缓冲区的向量被销毁(返回内存),然后现在空的字符串被破坏。

对于默认的析构函数,顺序是销毁向量的字符串缓冲区,然后在销毁向量时返回向量字符串的内存,然后销毁字符串并返回缓冲区。

您可以通过对运营商new&delete,或者如果您使用自定义分配器。

最后,这样的析构函数有时更容易调试,因为您可以逐步完成它们。

然而,这些微妙的效果很可能都不是编写代码的开发人员想要的。

最新更新