我有一个类有两个字段,一个是指针,另一个是 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/