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.
- «Nie używaj unsigned jako indeksu string-a
- Kilka wartościowych książek»
- ↑C++ - sztuczki i niebezpieczeństwa