Przy odpowiadaniu na pewien post zauważyłem
dziwną rzecz w zachowaniu AnsiString z VCL .
Wykonując przypisanie obiektów typu AnsiString ,
następuje gubienie bufora znakowego jednego z nich .
Tworzę obiekt 'a' z jakimś napisem .
Tworzę obiekt 'b' .
Wykonuję przypisanie b = a ;
Modyfikuję napis w obiekcie 'b' .
Okazuje się że dane (napis) zostaje również zmodyfikowany
w 'a' . Co to za jaja .
Kompilator C++ Builder 3 ,program konsola z użyciem VCL .
#include <condefs.h>
#pragma hdrstop
#include <iostream.h>
// Konsola z użyciem VCL
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char **argv)
{
AnsiString a = "Przykladowy napis" ;
AnsiString b ;
cout << "Poczatkowa zawartosc zmiennej 'a' == " << a.c_str() << endl ;
cout << "Adresy przed kopiowaniem ." << endl ;
cout << "Adres bufora dla 'a' == " << (long)a.c_str()<< endl ;
cout << "Adres bufora dla 'b' == " << (long)b.c_str()<< endl ;
cout << endl ;
b = a ; // operator przypisania
cout << "Zapis znaku 'X' do zmiennej 'b' " << endl ;
b[2] = 'X' ;
cout << "Teraz zawartosc 'b' == " << b.c_str() << endl ;
cout << "Teraz zawartosc 'a' == " << a.c_str() << endl ;
cin.get();
return 0;
}
Wydruk z programu :
Poczatkowa zawartosc zmiennej 'a' == Przykladowy napis
Adresy przed kopiowaniem .
Adres bufora dla 'a' == 9578472
Adres bufora dla 'b' == 4366986
Zapis znaku 'X' do zmiennej 'b'
Teraz zawartosc 'b' == PXzykladowy napis
Teraz zawartosc 'a' == PXzykladowy napis
STL zachowuje się 'normalnie' ,tzn jeden obiekt nie ma wpływu na drugi .
To wydruk gdy zastąpimy AnsiString VCL typem string z STL :
Poczatkowa zawartosc zmiennej 'a' == Przykladowy napis
Adresy przed kopiowaniem .
Adres bufora dla 'a' == 9584472
Adres bufora dla 'b' == 4330196
Zapis znaku 'X' do zmiennej 'b'
Teraz zawartosc 'b' == PrXykladowy napis
Teraz zawartosc 'a' == Przykladowy napis
Czyli Ok,