Aktywne Wpisy

MaxHamilton +37
Czego nauczyli mnie p0lscy rodzice boomerzy?
- szanuj starszych i kobiety (obojętnie jacy są dla ciebie)
- dla kobiet masz być miły, dżentelmen, zawsze pomagać i dbać o nie
- najlepszy chłopak to spokojny, ułożony, nie żaden wariat
- nie wychylaj się, na ciebie przyjdzie kolej
- inni mają gorzej a jak mają lepiej to ty nie jesteś wszyscy
- najważniejsza jest nauka a jakieś imprezy to prosta droga do rynsztoku
-
- szanuj starszych i kobiety (obojętnie jacy są dla ciebie)
- dla kobiet masz być miły, dżentelmen, zawsze pomagać i dbać o nie
- najlepszy chłopak to spokojny, ułożony, nie żaden wariat
- nie wychylaj się, na ciebie przyjdzie kolej
- inni mają gorzej a jak mają lepiej to ty nie jesteś wszyscy
- najważniejsza jest nauka a jakieś imprezy to prosta droga do rynsztoku
-

Wierzycie, że los się kiedyś odwróci i szczęście do Was uśmiechnie?
#przegryw
#przegryw





Miałem dziś ciekawą przygodę z C++. Może jest mi ktoś w stanie to wyjaśnić.
Tworzyłem instancję jakiejś klasy która miała zwykłe pole typu bool, a w zasadzie strukturę booli. Podczas ustawiania różnych parametrów w metodzie, przyjmijmy, Init(), ustawiałem jakieś wartości dla tych booli. Po wyjściu z metody Init() wykonywał się inny (nie mój) kod, a następnie w kolejnej iteracji pętli głównej programu wywołuję po raz pierwszy kolejną metodę, przyjmijmy, Process(). Problem w tym że po wykonaniu tego "nie mojego kodu", struktura o której wspomniałem na początku... miała zupełnie inny adres. Co mogło coś takiego spowodować? Wydawało mi się niemożliwe żeby cokolwiek było w stanie przenieść (dosłownie, bo struktura przeniosła się razem z wartościami) jakieś komórki pamięci na stosie.
Później zamiast zwykłego pola, stworzyłem wskaźnik do tej struktury i w metodzie Init() utworzyłem obiekt na stercie z pomocą operatora new. W tym momencie adres był już cały czas taki sam.
Potrafi ktoś to wyjaśnić?
@bartoneczek: To może być jakiś kod chroniący przed nadmierną fragmentacją pamięci.
W pofragmentowanej pamięci próba zaalokowania dużego obiektu zakończy się śmiercią programu.
Nie ma takiej możliwości, żeby zagregowana struktura zmieniła adres, jeśli nie zmienił się adres struktury, która ją agreguje. W C++ wszystko siedzi na offsetach i jest po prostu zabite na amen po linkowaniu.
Skłaniałbym się ku wyjaśnieniu @progresywnyRegres: w czym przechowujesz tą strukturę? Bo jeśli w jakimś wektorze/mapie (czyt: na stercie), to jej adres najprawdopodobniej się zmienił. Sprawdź w takim wypadku konstruktory kopiujące, przesuwające i
* tworzę mój nowy obiekt,
* wywołuję metodę Init(),
* wrzucam obiekt do wektora (o ile pamiętam to prawdopodobnie kopię, ja tej części nie pisałem)
* i jeszcze raz to samo (łącznie tworzę dwa obiekty). ;)
I to jest chyba nasze rozwiązanie. :) Dzięki Panowie. Mirko uczy, mirko bawi. :P