Wpis z mikrobloga

#programowanie #cpp

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ć?


  • 5
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.


@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.
@Ginden: @bartoneczek: @progresywnyRegres:

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
@losiul: myślę że mogę powiedzieć "bingo". Mianowicie wygląda to tak że:

* 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