konstruktor kopiujący nie jest uruchamiany
Ostatnio zmodyfikowano 2013-08-11 12:10
b00rt00s Temat założony przez niniejszego użytkownika |
konstruktor kopiujący nie jest uruchamiany » 2013-08-11 02:09:22 Przy okazji pewnego programu okazało się, że chyba nie rozumiem podstaw, a dokładniej działania konstruktorów kopiujących. Skrócony przykład: #include <iostream>
class MyClass { int * _a; public: MyClass( int a ) { _a = new int(); * _a = a; } MyClass( const MyClass & other ) { std::cout <<* _a << " copy" << std::endl; _a = new int(); * _a = *( other._a ); } ~MyClass() { std::cout <<* _a << " delete" << std::endl; delete _a; } void print_a_address() { std::cout << _a << " print" << std::endl; } };
int main() { std::cout << "main start" << std::endl; MyClass a( 1 ); MyClass b( 2 ); a.print_a_address(); b.print_a_address(); std::cout << "main copy" << std::endl; a = b; a.print_a_address(); b.print_a_address(); std::cout << "main end" << std::endl; return 0; } Program się kompiluje poprawnie, ale jest problem z uruchomieniem. Wynik jest taki: main start 0x14d9010 print 0x14d9030 print main copy 0x14d9030 print 0x14d9030 print main end 2 delete 0 delete Następnie jest crash, wywołany, jak się domyślam, dwukrotnym usunięciem tego samego wskaźnika. Problem w tym, że nie został wykonany napisany przeze mnie konstruktor kopiujący, w którym wskaźnikowi _a nadawany jest nowy adres. Dlaczego mój konstruktor kopiujący nie jest uruchamiany? |
|
killjoy |
» 2013-08-11 02:16:25 Masz tylko konstruktor kopiujący, ale nie masz operatora =, ot co. |
|
pekfos |
» 2013-08-11 12:10:29 Konstruktor kopiujący jest wywoływany, jak sama nazwa wskazuje, przy tworzeniu obiektów. Do zwykłych przypisań jest używany operator =. Nie masz go, więc został wygenerowany przez kompilator i kopiuje po prostu wskaźnik. |
|
« 1 » |