c++ - 返回一个本地对象会导致垃圾,而返回同一个对象临时工作正常

标签 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 数组,而不是对象本身),我收到了完整的垃圾,它以一堆方 block 的形式执行。

但是当我返回一个临时对象时 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;
    }
}

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

最佳答案

在您创建 MyString 的两个地方,它们是在您的 substr 函数的上下文中创建的。返回语句必须复制它们。您的复制构造函数可能没有执行您需要它执行的操作。

一个更简单的设计是让您的 substr 函数返回一个指向您使用 operator new 创建的 MyString 的指针。

关于c++ - 返回一个本地对象会导致垃圾,而返回同一个对象临时工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26819799/

相关文章:

c++ - move 自定义容器的构造函数?

c++ - 使用宏的函数访问

c++ - fprintf 函数不工作,但它返回正数

c++ - Objective-C++ 不能在枚举 block 中使用 vector push_back

c++ - 对象生命周期和未定义的行为

C++ 帮助 boost::ptr_map/boost::checked_delete 失败

c++ - Segmentation Fault(core dumped)链表

xerces - Xerces-C 中的 XPath 支持

c++ - 如何测试标准库中是否定义了 std::remove_cvref?

c++ - 正则表达式帮助,匹配产生额外的空格