【问题标题】:boost::multiprecision and rocksdb::Slice string interaction c++boost::multiprecision和rocksdb::Slice字符串交互c++
【发布时间】:2020-10-22 01:06:17
【问题描述】:

您好,有人可以向我解释一下这里发生了什么吗?

版本:
librocksdb-dev/bionic,现在 5.8.8-1 amd64 [已安装]
librocksdb5.8/bionic,现在 5.8.8-1 amd64 [已安装,自动]
升压-cpp 1.74.0

#include <iostream>
#include <string>
#include <boost/multiprecision/cpp_int.hpp>
#include <rocksdb/db.h>

int main() {
    boost::multiprecision::checked_uint256_t check("115792089237316195423570985008687907853269984665640564039457584007913129639935");
    std::string test = check.str();
    rocksdb::Slice dbkey = check.str();
    std::cout << check << std::endl;
    std::cout << dbkey.ToString() << std::endl;
    dbkey = test;
    std::cout << dbkey.ToString() << std::endl;
    return 0;
}

output: 
115792089237316195423570985008687907853269984665640564039457584007913129639935
        9237316195423570985008687907853269984665640564039457584007913129639935
115792089237316195423570985008687907853269984665640564039457584007913129639935

【问题讨论】:

    标签: c++ boost rocksdb


    【解决方案1】:

    这个 sn-p 是未定义的行为:

    rocksdb::Slice dbkey = check.str();
    /* ... */
    std::cout << dbkey.ToString() << std::endl;
    

    rocksdb::Slice 是一个带有数据指针和大小的“胖指针”,就像 C++20 的 std::span 或 C++17 的 std::string_view。它对你分配给它的任何东西都没有所有权。

    check.str() 的结果是一个临时对象,这意味着它在表达式的末尾被销毁。销毁后,dbkey中存储的指针不再有效。

    您生成第三行输出的方式是使用rocksdb::Slice 的正确方式 - 一个对象拥有数据,切片用于查看数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2017-03-17
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多