Ostrożnie z dodawaniem stringów

Po pewnym obyciu z klasą string, dosyć szybko zaczyna się pisać rzeczy typu:

  // commentBody jest obiektem klasy string
  some_fun("Blah blah: " + commentBody + " that's all");

Działa to jak trzeba - przy pomocy konstruktora string(const char *) generowane są tymczasowe stringi, następnie zostają dodane - czyli skonkatenowane - i wynik zostaje parametrem funkcji some_fun.

Łatwo się jednak 'nadziać'. Na przykład tak:

   int count = ..;
   // ...
   some_fun("Value: " + count);

Intuicyjnie każdy oczekiwałby w takiej sytuacji jakiegoś błędu kompilacji (programista zapomniał 'obłożyć' count jakąś funkcją konwertującą int na string). Ale nie. Kompilator zinterpretuje powyższe jako +(const char *, int) czyli dodanie stałej do wskaźnika. A to - jak wiadomo jeszcze z C - oznacza przesunięcie wskaźnika. Jeśli count ma wartość 2, some_fun zostanie wywołane z parametrem "lue:". A jeśli count jest ujemne albo większe niż 6 staną się rzeczy straszliwe a nieznane.

Nie ma na to dobrego sposobu. Trzeba po prostu uważać. Albo zawsze pisać w stylu:

some_fun(string("Value: ") + string(commentBody) + string(" that's all"));

co zresztą nie do końca nas ratuje, bo string(5) stworzy string długości jeden zawierający znak o kodzie 5 - ale przynajmniej nie zgwałcimy naszej ukochanej siostry pamięci.

komentarze obsługiwane przez Disqus