【问题标题】:reinterpret_cast<std::string*> cause segmentation fault on gcc but works on clangreinterpret_cast<std::string*> 在 gcc 上导致分段错误,但适用于 clang
【发布时间】:2021-06-10 06:23:14
【问题描述】:

gcc 和 clang 版本都是 11,这里是示例代码

#include <string>
#include <cstddef>


void store_rvalue_string(std::byte* buffer, std::string&& value) {
    *reinterpret_cast<std::string*>(buffer) = std::move(value);
}


int main() {
    auto buffer = new std::byte[1024];
    std::string str = "hello";
    store_rvalue_string(buffer, std::move(str));
}

【问题讨论】:

  • 这不是有效的 C++ 代码。

标签: c++ gcc clang


【解决方案1】:

这是一个严格的别名违规,因此是 UB。

一个不太正式的答案是你在一块内存上调用std::basic_string::operator=,而string构造函数一开始就没有被调用。

我的猜测是,在 Clang 上,内存恰好被零填充,而一个填充零字节的字符串在您的标准库实现中被视为空。

正确的解决方案是使用placement-new,创建一个new对象(通过调用它的构造函数):

new(buffer) std::string(std::move(str));

【讨论】:

  • ... 和 new std::byte[1024]; 可以替换为 new std::byte[sizeof(std::string)];
  • Demo 或两个unique_ptr's
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2015-06-10
  • 2021-06-14
相关资源
最近更新 更多