我有一个具有两个字段的类,其中一个是指针,另一个是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的析构函数给我一个错误。这段代码有什么问题?
答案 0 :(得分:3)
表达式m_pchString = new char(m_nLength)
分配一个 个字符,并将其初始化为值m_nLength
。它不会不分配m_nLength
个元素的数组。
这意味着将字符串复制到m_pchString
所指向的内存中时,您将越界,并且您将拥有undefined behavior。
如果要分配一个数组或多个元素,则需要使用方括号[]
,如
m_pchString = new char[m_nLength];