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

Sim*_*mon 42 c++ struct destructor

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

typedef struct _someStruct_ {
   std::string someString; 
   std::vector<std::string> someVectorOfStrings;
   int  someOtherStuff;

   ~_someStruct_()
   {
      someString.clear();
      someVectorOfStrings.clear(); 
   }
} someStruct; 
Run Code Online (Sandbox Code Playgroud)

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

如果我编写了代码,我就不会想到在这里添加一个显式的析构函数 - 我只是让编译器继续使用它.

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

我在这里遗漏了什么 - 有没有理由在析构函数中明确清除字符串和向量?我怀疑发送给我的是一个C程序员(参见typedef),他试图将一些C代码转换成C++.

Kon*_*lph 70

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

正如你自己所说,代码中还有其他警告标志.typedef struct例如,在C++中使用没有任何意义,它与空的析构函数一样冗余:代码是由对C++边缘掌握的人编写的,必然会有更多的陷阱(一方面,类名无效,因为全球范围内的领先下划线).

  • 等等,是不是必须是一个前导下划线*后跟一个大写字符*? (3认同)
  • @Emilio这在这里根本不适用,因为代码无论如何都不是有效的C代码. (3认同)

Bil*_*nch 50

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

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


Yak*_*ont 21

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

它做了三件事.

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

其次,它改变了清理内容的顺序.字符串保存的缓冲区被清除,然后向量中的字符串保存的每个缓冲区被销毁,而保存它们的字符串被销毁,然后带有未使用缓冲区的向量内存被销毁(返回内存),然后现在空的字符串被销毁.

使用默认的析构函数,顺序是向量的字符串的缓冲区被销毁,然后在向量被销毁时返回向量字符串的内存,然后销毁字符串以及返回其缓冲区.

你可以用尽可能适合重载运营商检测到这种newdelete,或,如果您使用自定义的分配.

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

然而,可能的是,编写该代码的开发人员不打算采用这些微妙的效果.