boost::multiprecision和rocksdb::Slice字符串交互c++
boost::multiprecision and rocksdb::Slice string interaction c++
嗨,有人可以向我解释一下这里发生的事情吗?
版本:
librocksdb-dev/bionic,现在 5.8.8-1 amd64 [已安装]
librocksdb5.8/bionic,现在是 5.8.8-1 amd64 [已安装,自动]
boost-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
此代码段是未定义的行为:
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
- 一个对象拥有数据,一个切片用于查看数据。
嗨,有人可以向我解释一下这里发生的事情吗?
版本:
librocksdb-dev/bionic,现在 5.8.8-1 amd64 [已安装]
librocksdb5.8/bionic,现在是 5.8.8-1 amd64 [已安装,自动]
boost-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
此代码段是未定义的行为:
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
- 一个对象拥有数据,一个切片用于查看数据。