下面的代码段在linux上运行,并报告分段错误(核心转储)。我发现调用析构函数时发生错误,但无法弄清楚原因。有人可以帮忙解释一下吗?

    class TStringPair{
    public:
        TStringPair(){
            memset(this, 0, sizeof(TStringPair));
        }


        string a;
        string b;
    };

    int main (int argc, char* argv[])
    {
        TStringPair test;
        return 0;
    }

最佳答案

memset确实毁了类。 std::string(以及许多其他C++类)的内存不应填充零,而应同时填充两个。

为了说明为什么这是一个坏主意,请考虑一个具有指向实际字符的指针的std::string。糟糕,它现在指向0而不是指向空字符串。将非C对象清零的其他原因也很糟糕,但是它们与本示例的相关性并不高。

我想去掉memset而不放任何东西会得到您想要的确切结果。

09-11 19:24