我已将磁盘文件读入内存到声明为:
的数组中char * buffer = new char [length];
然后重新解释数组:
std::string strbuf(reinterpret_cast<const char *>(buffer), length);
并立即检查提供的字符串的类型。
cout << "buffer is: " << typeid(buffer).name() << '\n';
cout << "strbuf is: " << typeid(strbuf).name() << '\n';
buffer is: Pc
strbuf is: Ss */
正如您所读,字符串“strbuf”的类型为Ss。这是什么意思?
答案 0 :(得分:7)
Ss
是std::basic_string<char, std::char_traits<char>, std::allocator<char>>
的错位名称。
如果您在使用规则时遇到问题,可以使用c++filt
工具:
$ c++filt <<< _ZSs
std::basic_string<char, std::char_traits<char>, std::allocator<char> >
答案 1 :(得分:1)
这一行:
std::string strbuf(reinterpret_cast<const char *>(buffer), length);
真的应该是:
std::string strbuf(buffer, length);
不会将 buffer
解释为字符串。它复制它。此时strbuf
拥有自己的整个缓冲区副本。当您执行delete [] buffer;
时,strbuf
仍然拥有自己的,并且仍然是完全有效的对象。由于string
管理自己的内存,因此您无需明确删除它 - 您可以让它超出范围。