gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:39 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com