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++边缘掌握的人编写的,必然会有更多的陷阱(一方面,类名无效,因为全球范围内的领先下划线).
Yak*_*ont 21
析构函数几乎完全是冗余的.
它做了三件事.
首先,它阻止自动创建复制/移动构造函数和赋值.这......可能不是一件好事.但也许是理想的.然而,与不在那里不一样.
其次,它改变了清理内容的顺序.字符串保存的缓冲区被清除,然后向量中的字符串保存的每个缓冲区被销毁,而保存它们的字符串被销毁,然后带有未使用缓冲区的向量内存被销毁(返回内存),然后现在空的字符串被销毁.
使用默认的析构函数,顺序是向量的字符串的缓冲区被销毁,然后在向量被销毁时返回向量字符串的内存,然后销毁字符串以及返回其缓冲区.
你可以用尽可能适合重载运营商检测到这种new与delete,或,如果您使用自定义的分配.
最后,这些析构函数有时可以更容易调试,因为您可以逐步完成它们.
然而,可能的是,编写该代码的开发人员不打算采用这些微妙的效果.
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |