2014-12-22 5 views
-1

Я прочитал дисковый файл в память в массив, объявленный как путем:Что означает тип Ss?

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. Что это значит?

+1

Это измененное имя. См. [Этот вопрос] (http://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname) – Barry

+2

_One_ вопрос на вопрос, пожалуйста. Как и должно быть само собой разумеющимся. Вы не пошли бы в статью Википедии «Собака» и ожидаете также найти описание кошек. –

ответ

6

Ss является искаженным именем для std::basic_string<char, std::char_traits<char>, std::allocator<char>> согласно Itanium ABI mangling rules.

Если у вас возникли проблемы, применяя правила в вашем уме, вы можете использовать c++filt инструмент:

$ c++filt <<< _ZSs 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > 
1

Эта линия:

std::string strbuf(reinterpret_cast<const char *>(buffer), length); 

Что действительно должно быть:

std::string strbuf(buffer, length); 

не толковатьbuffer как a st кольцо. Это копий это. strbuf в этот момент владеет собственной копией всего буфера. Когда вы делаете delete [] buffer;, strbuf по-прежнему имеет свой собственный и по-прежнему совершенно действительный объект. Поскольку string управляет собственной памятью, вам также не нужно явно удалять ее - вы можете просто позволить ей выйти из области видимости.

+0

Хорошо. Теперь я вижу, почему только один вопрос в каждом посте. На мои вопросы были ответы, но на разные плакаты. Я могу принять только одно сообщение как ответ, так что один хороший ответ не распознается. –

Смежные вопросы