const char* a std::vector

0

No cześć, przepraszam za trochę głupie pytanie ale powiedzmy że tworzę sobie std::vector od const char*

i wygląda to tak: std::vector < const char* > k;

W jaki sposób mam potem użyć przy tym metody push_back? Gdyby to był np. typ std::string to po prostu zrobiłbym coś takiego: k.push_back(std::string()); ale jeżeli wpiszę k.push_back(const char* ()); to wyskakuje błąd. Jak mam to w takim razie zrobić?

2
k.push_back("hello world!");

bądź też

k.push_back(nullptr);
0

Dzięki śliczne :)

Chyba mam dzisiaj gorszy dzień, że miałem problem z tak prostą rzeczą...

4

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:

  1. Trzeba zadbać o ich usuwanie jak wektor nie będzie potrzebny (inaczej mamy memory leaka)
  2. 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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1