Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

konstruktor kopiujący nie jest uruchamiany

Ostatnio zmodyfikowano 2013-08-11 12:10
Autor Wiadomość
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:
C/C++
#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?
P-89953
killjoy
» 2013-08-11 02:16:25
Masz tylko konstruktor kopiujący, ale nie masz operatora =, ot co.
P-89954
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.
P-89969
« 1 »
  Strona 1 z 1