Na wszelki wypadek dodam, że generalnie vector<const char*>
wymaga trochę uwagi jeśli chodzi o object lifetime / zwalnianie pamięci.
Tj. o ile w powyższych przykładach wszystko jest OK, o tyle w poniższych wszystko jest źle ;)
{
char x[] = "ala ma kota";
k.push_back(x);
// Błąd - x przestanie istnieć po wyjściu z tego bloku kodu, więc adres x który
// trafi do wektora k będzie niepoprawny (tzw. dangling pointer).
}
static char x[20]; // ew. po prostu globalny bufor / bufor na heapie
strcpy(x, "ala"); k.push_back(x);
strcpy(x, "ma"); k.push_back(x);
strcpy(x, "kota"); k.push_back(x);
// Błąd - ponieważ do wektora trafia adres bufora x (a nie jego zawartość)
// to w przypadku wypisania stringów spod adresów z bufora, zostanie wypisane:
// kota kota kota
Najlepszym rozwiązaniem jest po prostu użycie std::vectorstd::string - wtedy o nic nie trzeba się martwić (a ew. narzut pamięciowo-obliczeniowy w bardzo bardzo bardzo niewielu przypadkach ma większe znaczenie niż bezproblemowość takiego kodu).
Alternatywnie można wykonywać kopie na heapie stringów które się dodaje (funkcja strdup), przy czym wtedy:
- Trzeba zadbać o ich usuwanie jak wektor nie będzie potrzebny (inaczej mamy memory leaka)
- Należy używać ZAWSZE strdup, tj. nie można raz zrobić k.push_back(strdup("asdf")), a raz k.push_back("asdf"), ponieważ w tym drugim wypadku przy usuwaniu danych (punkt 1) wszystko szlag trafi (aka poleci exception przy próbue free na stringu z globalnej pamięci).
EDIT: usunąłem const - thx @MarekR22 za zwrócenie uwagi :)