返回一个本地对象导致垃圾,而返回相同的对象临时工作正常

时间:2014-11-08 17:10:55

标签: c++

我目前正在实现自己的字符串类(仅用于培训),但我在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;
    }
}

那我的错误在哪里?谢谢!

2 个答案:

答案 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;
}