下面的代码片段在linux上运行,它会报告Segmentation Fault(核心转储)。我发现在调用析构函数时会发生错误,但无法弄清楚原因。任何人都可以帮忙解释一下吗?
class TStringPair{
public:
TStringPair(){
memset(this, 0, sizeof(TStringPair));
}
string a;
string b;
};
int main (int argc, char* argv[])
{
TStringPair test;
return 0;
}
答案 0 :(得分:4)
memset
完全破坏了你的课程。 std::string
(以及许多其他C ++类)的内存不应该用零填充,但是你要填充两者。
为了说明为什么这是一个坏主意,请考虑std::string
指向实际字符的指针。糟糕,而不是指向空字符串,它现在指向0.还有其他原因,为什么将非C对象清零是坏的,但它们与此示例并不完全相关。
我想要移除memset
并且没有任何内容可以提供您想要的确切结果。
答案 1 :(得分:2)
在运行TStringPair构造函数的主体之前,为两个字符串成员对象中的每一个都会自动调用std :: string类的默认构造函数。
std :: string默认构造函数将这两个对象的内容设置为正确的状态。什么是正确的状态?我们不知道(无论如何都不是通过查看STL源代码),但这没关系,因为我们不必知道 - 我们可以依赖std :: string类实现者来做正确的事情。 / p>
然而,在那些构造函数运行之后,你的memset会通过零字节来覆盖(覆盖他们所写的任何信息)...现在这些字符串对象处于损坏状态,所以当你的崩溃时你会发生崩溃就不足为奇了析构函数运行并遇到腐败。