vector i struktura ze zmiennymi wskaźnikowymi

0
struct person {
        char* firstname;
        char* lastname;
        int func;
};

person* member;
vector<person> membersList;

i teraz jak wpisuje

member = new person;
int len=10;
member->firstname = new char[len];
member->lastname = new char[len];
member->func=1;

membersList.push_back(member)

to linijka z push_back do wektora zwraca błąd. Szukałem trochę o tym i znalazłem informacje, że jest to problem z zmiennymi wskaźnikowymi w strukturze. Ale niestety nie znalazłem sposobu rozwiązania tego problemu.

Czy można to jakoś rozwiązać czy trzeba przebudować ?

0

membersList.push_back(member)

member to wskaźnik.

Zamień tę linijkę na:

membersList.push_back(*member)
0

@-=mAkAbrAs=-:
Dzieki no fakt, wskaźnik musi mieć gwiazdkę.

0

push_back() kopiuje argument:

typ* x = new Typ();
jakisTapVec.push_back(*x);

Każdy tak stworzony rekord będzie zajmował 2x więcej pamięci... Sprawdź adresy "x-a" i "x-a" w wektorze.

0

Poza tym wystarczy zmienić typ jaki ma przechowywać wektor z person na *person i już będzie działać to co chcesz. To jest imo lepsze rozwiązanie.

0

Nie będzie zajmował 2x więcej pamięci. Pod warunkiem, że ciało funkcji wygląda tak:

{
    member = new person;
    int len=10;
    member->firstname = new char[len];
    member->lastname = new char[len];
    member->func=1;
    
    membersList.push_back(*member);
}

no i gdzieś poza funkcją powinno być łapanie wyjątków, jakby się alokacja pamięci nie powiodła..

Ale, jeśli po:

membersList.push_back(member)

będzie

delete member

to będzie z wielkim prawdopodobieństwem źle.

waco
Rozwiązanie z typem jaki ma vector przechowywać: zamiast person to person * według mnie też jest dużo lepsze.

0
-=mAkAbrAs=- napisał(a)

Nie będzie zajmował 2x więcej pamięci. Pod warunkiem, że ciało funkcji wygląda tak:

    membersList.push_back(*member);

jak nie bedzie zajmowac skoro ta linia zrobi kopie instancji obiektu :P

vector<person*> membersList

i po bulu :P

0

No zrobi, fakt. Zasugerowałem się tym, że przy dodawaniu do vectora, wartości pól firstname i lastname zostaną przekopowane i w zasadzie zaalokowana pamięć na te bufory nie zginie. Ale fakt, będzie wyciek.

Także najlepiej zrobić vector z tym obiektu person * lub pozostając przy typie person - zamiast struktur używać klas, zrobić własny konstruktor kopiujący, w którym robiona będzie kopia zaalokowanych firstname i lastname i po dodaniu do vectora koniecznie kasowac member.

0

std::string i jego copy-on-write zamiast char*? jak korzystacie z vector, czemu nie std::string, albo chociaz vector<char> zamiast char* ?! ludzie.. litosci. nie po to przynosi sie łopatę, zeby potem nią pojedynczo kamyczki przerzucac..

poza tym, element spoza wektora zapewne wyparuje po przejsciu scope'u metody i pozostanie tylko obiekt/kopia w wektorze. nie przekombinowujcie.. te obiekciki to nie półmegowe bitmapy zeby w takie szczegoly sie bawic. pal licho te kopie, kompilator na release pewnie ja zreszta wywali

*) - a ew. wycieku by nie bylo, gdyby obiekty i ich uzytkownicy sprzatali po sobie. wina programisty, nie wektora

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