Изучаю stl и наткнулся на следующую проблему:
При преобразовании из const_char* в char* происходит
какая то ерунда, указатель p (см. код) начинает смотреть на какойто хлам в памяти
class A {
public:
std::string get(void) { return "this is test"; };
};
void main (void) {
A a;
std::cout<<"result 1: "<< a.get() <<std::endl;
//// почему тут глючит ?
char *p = const_cast <char*> ( a.get().c_str() );
std::cout<<"result 2: "<< p <<std::endl;
getch();
}
Re: опять вопрос по c_str()
От:
Аноним
Дата:
28.05.04 09:42
Оценка:
Здравствуйте, niki_, Вы писали:
Используй тэги [ccode]/ [/ccode]
_>#include <iostream>
_>#include <string>
_>#include <conio.h>
_>class A {
_>public:
_> std::string get(void) { return"this is test"; };//void в скобках не нужен,
//слава Богу, 21 век, и пишем на С++
_>};
_>void main (void) { //main должна иметь тип int () либо int (int, char **), т.е.
_> A a;
_> std::cout<<"result 1: "<< a.get() <<std::endl;
_> //// почему тут глючит ?
_> char *p = const_cast <char*> ( a.get().c_str() );//серьезная проблема!!!!!
//возвращается временный объект, по окончании полного выражения он разрушается, указатель
//инвалиден
_> std::cout<<"result 2: "<< p <<std::endl;
_> getch();
_>}
IMHO применять const_cast<char*> по отношению к результату возвращаемому из std::basic_string<_Char>::c_str() вредно, потому как в конченом итоге руки могут зачесаться этот результат использовать как lvalue в целях какой-нибудь сомнительной оптимизации, а к чему это приведёт и где это вылезет даже Страуструпу неизвестно.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здесь проблема не в преобразованиях. Ты возвращаешь временный объект типы string, который удаляется после завершения выражения, в данном случае инициализации указателя p. Удаление объекта осовбождает и его буфер, после чего р указывает в неинициализированную область в памяти.
Да здравствует мыло душистое и веревка пушистая.
Re: опять вопрос по c_str()
От:
Аноним
Дата:
28.05.04 11:54
Оценка:
Здравствуйте, niki_, Вы писали:
А зачем?
const T к T лучше не преобразовать
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, niki_, Вы писали: А> А зачем? А>const T к T лучше не преобразовать
Тьфу ... елки палки, опять на детские грабли наступил ... c временным объектом.
проблема была собсно в следующем :
В SDK для Unigraphics, под который я пишу утилиты, есть обширный
набор C функций и не очень обширный набор C++ классов.
С С++ под Unigraphics работать просто и приятно, за исключением того,
что не весь функционал C-шных есть в C++ классах.
Поэтому мой код представляет жуткий микс из C/C++ и , периодически, получив
из C++ метода std::string, например имя объекта, затем надо это имя преобразовать
в указатель на char, чтобы использовать его в С-функции, ф-ция имеет прототип типа
int do_it( char *name, int data);
от этого и происходит преобразование const T к T
Спасибо всем за ответы !
PS Лучше два раза наступить на взрослые грабли, чем один раз на детские