析构函数调用时发生错误

时间:2018-08-20 20:05:44

标签: c++ c++11 heap-memory

我有一个具有两个字段的类,其中一个是指针,另一个是int值,用于保存构造函数中字符串集的长度。

class MyString 
{
    char* m_pchString;
    int m_nLength;
public:
    MyString(const char* pchString="")
    {

        m_nLength = strlen(pchString) + 1;
        m_pchString = new char(m_nLength);
        strcpy_s(m_pchString,m_nLength, pchString);
    }

    MyString(const MyString &Source)
    {
        m_nLength = Source.m_nLength;
        if (Source.m_pchString)
        {
            m_pchString = new char(m_nLength);
            strcpy_s(m_pchString,m_nLength,Source.m_pchString); 
        }
        else
        {
            m_pchString = 0;
        }
    }

    ~MyString() 
    {
        delete[] m_pchString;
        m_pchString = 0;
    }

    char* GetString()
    {
        return m_pchString;
    }

    int GetLength()
    {
        return m_nLength;
    }
};

然后在控制台应用程序中使用它并创建一个对象cHello。随后创建另一个对象,并由cHello在一个块内为其分配

int main()
{
    MyString cHello ("Hello,World");
    {
        MyString cCopy = cHello;
    }

    std::cout << cHello.GetString();
}

当cCopy的生存期结束时,cCopy的析构函数给我一个错误。这段代码有什么问题?

1 个答案:

答案 0 :(得分:3)

表达式m_pchString = new char(m_nLength)分配一个 个字符,并将其初始化为值m_nLength。它不会分配m_nLength个元素的数组。

这意味着将字符串复制到m_pchString所指向的内存中时,您将越界,并且您将拥有undefined behavior

如果要分配一个数组或多个元素,则需要使用方括号[],如

m_pchString = new char[m_nLength];