创建了我自己的字符串类,当它调用重载赋值操作符时意外中断(即我相信)。当调用重载赋值操作符后试图删除mStr时,它就会中断。
被删除的mStr为"nPlatinum: 5 nGold: 5 nSilver: 6 nCopper: 5 "
我做错了什么,我怎么能确保我的程序不打破没有内存泄漏?
这里代码中断
String::~String()
{
delete [] mStr;
mStr = nullptr;
}
代码在这里之前中断
String tempBuffer;
//Store entire worth of potions
tempBuffer = "Platinum: ";
tempBuffer += currencyBuffer[0];
tempBuffer += "nGold: ";
tempBuffer += currencyBuffer[1];
tempBuffer += "nSilver: ";
tempBuffer += currencyBuffer[2];
tempBuffer += "nCopper: ";
tempBuffer += currencyBuffer[3];
mCost = tempBuffer;
重载赋值操作符
String &String::operator=(const String & rhs)
{
//Check for self-assignment
if(this != &rhs)
{
//Check if string is null
if(rhs.mStr != nullptr)
{
//Delete any previously allocated memory
delete [] this->mStr;
//Deep copy
this->mStr = new char[strlen(rhs.mStr) + 1];
strcpy(this->mStr, rhs.mStr);
}
else
this->mStr = nullptr;
}
//Return object
return *this;
}
重载添加赋值操作符
String &String::operator+=( String rhs)
{
//Check for self-assignment
if(this != &rhs)
{
//Convert to cString
char * buffer = rhs.c_str();
//Find length of rhs
int length = strlen(buffer);
//Allocate memory
char * newSize = new char[length + 1];
//Copy into string
strcpy(newSize, buffer);
//Concatenate
strcat(this->mStr, newSize);
//Deallocate memory
delete [] newSize;
}
//Return object
return *this;
}
拷贝构造函数
String::String(const String & copy)
:mStr()
{
*this = copy;
}
<<p> 字符串构造函数/strong> String::String(char * str)
{
//Allocate memory for data member
mStr = new char[strlen(str) + 1];
//Copy str into data member
strcpy(mStr, str);
}
字符串构造函数
String::String(char ch)
{
//Assign data member and allocate space
mStr = new char[2];
//Assign first character to the character
mStr[0] = ch;
//Assign second character to null
mStr[1]= ' ';
}
- 如果
rhs
包含nullptr
,this->mStr
被分配给nullptr
而没有delete[]
,operator=()
可能存在内存泄漏 - 在
operator+=()
中,this->mStr
在连接之前没有被扩展。这意味着strcat()
将写入内存,它不应该这样做,导致未定义的行为,可能是析构函数中看到的问题的原因。
我假设这是一个练习(否则您将使用std::string
)。您的问题似乎是operator+=
仅为您添加的字符串分配足够的空间,而不是足够的空间用于原始字符串和添加到其末尾的新块。您需要分配更多的空间:char * newSize = new char[strlen(this->mStr) + length + 1];
,然后删除旧的字符串指针并将newSize
指针分配给类成员。