我目前正在实现自己的字符串类(仅用于培训),但我在substr()方法中遇到了一些问题:
MyString MyString::substr(size_t position, size_t length)
{
if (checkBounds() || length == 0)
{
return MyString();
}
char* tmp = new char[length + 1];
memcpy(tmp, this->s + position, length);
tmp[length] = STRING_ESCAPE;
MyString result(tmp);
delete[] tmp;
tmp = nullptr;
return result;
}
当我调用此方法并打印返回值(我打印char数组actuallay,而不是对象本身)时,我收到完整的垃圾,这是一堆正方形。
但是当我返回一个临时对象return MyString(tmp)
时,一切正常。最初我怀疑这个问题与delete []操作有关,但是将其评论显示没有效果。
调用的MyString构造函数如下:
MyString::MyString(const char* s)
{
size_t length = this->strlen(s);
this->sLength = length;
this->s = new char[length + 1];
for (size_t i = 0; i <= length; ++i)
{
this->s[i] = *s;
++s;
}
}
那我的错误在哪里?谢谢!
答案 0 :(得分:0)
在创建MyString的两个位置,它们是在substr函数的上下文中创建的。 return语句必须复制它们。您的复制构造函数可能没有按照您的需要执行操作。
一个更简单的设计是让你的substr函数返回一个指向你用operator new创建的MyString的指针。
答案 1 :(得分:0)
你确实错过了复制构造函数。这样的事情可以完成这项工作:
MyString::MyString(const MyString& other) {
size_t length = strlen(other.s);
s = new char[length+1];
strcpy(s,other.s);
this->sLength = length;
}