[C++] destruktor klasy i core dumped

To nie zadziałałby wtedy ten przesuwający operator przypisania? :o To bym dopiero się popisał na obronie… #-o

Przesuwania domyślnie działają właściwie tylko dla obiektów tymczasowych (co do których kompilator wie, że za chwilę zostaną zniszczone). Nawet jeśli ręcznie użyjesz przesunięcia to i tak w pamięci zostanie główna część obiektu Macierz, chyba że byś ją potem ręcznie usuwał. Jednak główną ideą przeciążania operatorów jest przyśpieszenie pisania i poprawa czytelności kodu, a ręczne sprzątanie po każdym dodawaniu raczej nie poprawia czytelności ani nie przyśpiesza pisania :wink:

A gdyby tak w przesuwającym operatorze przypisania i konstruktorze przesuwającym dodać taką część sprzątającą? Nie kłóciłoby się to z ideą tego wynalazku? Pytam już po prostu z czystej ciekawości. :wink:

Po pierwsze, domyślnie by się nie wywołały bo zwracasz zwykłą l-referencję, a one przyjmują r-referencję (do której są domyślnie przypisywane obiekty tymczasowe).

Po drugie, musiałbyś zagwarantować, że wszystkie obiekty będą alokowane tylko w jeden sposób (nie wiesz skąd dostajesz obiekt).

Po trzecie, udziwnianie na siłę zwykle nie prowadzi do dobrych efektów :wink:

Pozwól że tu akurat z tobą się nie zgodzę zamiast słowa zwykle powinno być słowo nigdy.

Nieprawda. Można wymusić przesunięcie zwykłego obiektu używając std::move. Obiekt niezależnie czy tymczasowy, czy nie, po wyciągnięciu zawartości operatorem przenoszącym jest niszczony jego destruktorem.

A ja mam takie pytanie: Czy wewnętrzna macierz nie może być przechowywana jako std::vector, lub std::vector>? Operatory kopiujące i przenoszące już są tam zaimplementowane poprawnie. Po to ktoś stworzył bibliotekę standardową, żeby właśnie nie męczyć się wynajdując koło na nowo.

EDIT: znalazłem coś takiego: http://www.boost.org/doc/libs/1_52_0/libs/numeric/ublas/doc/index.htm. Może się przyda.

O std::move pisałem parę postów wcześniej. Nawet w zacytowanym przez ciebie poście wspomniałem o ręcznym użyciu przesunięcia.

Przeniesienie samo z siebie nie niszczy obiektu (no chyba, że w konstruktorze przenoszącym lub operatorze przeniesienia, ktoś ręcznie wywoła destruktor źródła) a jedynie usuwa jego zawartość.

Jest wręcz odwrotnie niż piszesz, to w sytuacji, gdy po kopiowaniu oryginał zostałby od razu zniszczony, zamiast kopiowania kompilator stosuje przesunięcie.

To był projekt na zaliczenie, gdzie musiałem SAM zdefiniować klasę (pola, metody, funkcje zaprzyjaźnione, przeciążenia operatorów. Dlatego też celowo nie zastosowałem tejże biblioteki. Inna sprawa, że lepiej się uczyć pewnych rzeczy, samemu stukając kod. :wink:

Serdecznie dziękuję za pomoc i cierpliwość w tłumaczeniu niektórych rzeczy. :slight_smile: Obrona projektu udała się w 100%, piąteczka w indeksie jest, więc z mojej strony nie mam nic więcej do dodania. :smiley: