Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Bezpieczne zwracanie const char* przez funkcję

Ostatnio zmodyfikowano 2009-06-06 13:01
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
Bezpieczne zwracanie const char* przez funkcję
» 2009-06-06 01:10:25
Mamy przykładowo taki kod:
C/C++
const char * mieszadlo( const char * sInput )
{
    std::string sOutput = "Wymieszalem: ";
    sOutput += sInput;
    return sOutput.c_str();
}
Pytanie brzmi następująco:
1) Czy jest to bezpieczne?
2) Jeśli nie - jakie jest alternatywne rozwiązanie?
P-7477
DejaVu
Temat założony przez niniejszego użytkownika
» 2009-06-06 11:57:53
static nie zda egzaminu w multithreading'u :)
P-7478
DejaVu
Temat założony przez niniejszego użytkownika
» 2009-06-06 14:14:38
Nie nie nie ;p w pisanie w stylu C to ja nie mam zamiaru się bawić :P Zresztą to było maksymalne uproszczenie tego co chciałem osiągnąć. Generalnie stwierdziłem, że najlepiej będzie zwracać std::string'a i z niego wyciągnąć sobie c_str(). W każdym razie dzięki za Twoje uwagi. Sekcję krytyczną też rozważałem, jednak nie ma sensu używać armaty do takiego problemu. W każdym razie dzięki za Twoje uwagi.

Myślałem, że wymyślisz (lub znasz) coś więcej niż to co zaproponowałeś dlatego też założyłem ten temat :)

/edit:
Rozwiązanie jakie zastosowałem:
C/C++
string mieszadlo( const char * input )
{
    string output = "bleble ";
    output += input;
    return output;
}
P-7482
manfred
» 2009-06-06 10:23:49
No oczywiście, że nie jest bezpieczne - robisz string na stosie, robisz coś z nim, zwracasz go jako cstring i nagle przestaje istnieć. Najprościej zrobić z tego zmienną statyczną:
C/C++
const char * mieszadlo( const char * input )
{
    static string output;
    output = "Wymieszalem: " + input;
    return output.c_str();
}
P-18948
manfred
» 2009-06-06 13:01:03
Sekcje krytyczne? Muteksy? Semafory? A zresztą, zrób to jak normalni ludzie (jak już musisz cstringi):
C/C++
void mieszadlo( char * out, size_t cch, const char * in )
{
    const char txt[] = "Wymieszalem: ";
    strncpy( out, txt, cch );
    strncat( out, in, cch - sizeof( txt ) );
}
Swoją drogą, myślałem, że koleś, który wymyślił notację węgierską został zjedzony przez jakieś plemię, którego szaman nie mógł zrozumieć, jak można w taki po...rypany sposób nazywać zmienne.
P-18949
« 1 »
  Strona 1 z 1