gpt4 book ai didi

c++ - std::move - std::string - 内部指针

转载 作者:太空狗 更新时间:2023-10-29 23:52:25 25 4
gpt4 key购买 nike

我很惊讶 s 和 s2 指向“sample”的内部指针不相等,解释是什么?

#include <string>
#include <cassert>

int main()
{
std::string s("sample");

std::string s2(std::move(s));

assert(
reinterpret_cast<int*>(const_cast<char*>(s.data())) ==
reinterpret_cast<int*>(const_cast<char*>(s2.data()))
); // assertion failure here

return 1;
}

最佳答案

为什么您认为它们应该相同?您正在使用其 move 构造函数从 s 构造 s2。这会将数据所有权从 s 转移到 s2 并使 s 处于“空”状态。该标准没有详细说明这意味着什么,但在此之后访问 s 的数据(无需先重新分配)是未定义的。

string 的简化(和不完整)版本如下所示:

class string {
char* buffer;

public:

string(char const* from)
: buffer(new char[std::strlen(from) + 1])
{
std::strcpy(buffer, from);
}

string(string&& other)
: buffer(other.buffer)
{
other.buffer = nullptr; // (*)
}

~string() {
delete[] buffer;
}

char const* data() const { return buffer; }
};

我希望这能说明为什么 data() 成员不相等。如果我们省略了由 (*) 标记的行,我们将在 main 的末尾删除内部缓冲区两次:一次用于 s,一次对于 s2。重置 buffer 指针可确保不会发生这种情况。

关于c++ - std::move - std::string - 内部指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861620/

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