c++ - 调用析构函数时出错

标签 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。之后创建另一个对象并在一个 block 中通过 cHello 分配它

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

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

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

最佳答案

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

这意味着在将字符串复制到m_pchString 指向的内存中时,您将越界,您将得到undefined behavior。 .

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

m_pchString = new char[m_nLength];

关于c++ - 调用析构函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51937816/

相关文章:

c++ - 构造函数中的冒号是什么意思?

c++ - 测试未定义的行为

c++ - 有什么理由不使用 c++0x 进行 iOS 开发吗?

java - JVM以编程方式获取堆中最大的对象

java - Tomcat 7 - 我的堆转储有泄漏吗?

c++ - std::count over variable string 计数变量字符串

c++ - 在函数的模板参数上分支?

c++ - 类间比较

使用 std::atomic 的 C++11 无锁队列(多作者,单消费者)

java - 防止可能由于线程导致的堆内存不足异常