Konstruktor w klasie, który pobiera obiekty danej klasy

0

Cześć,
Chciałem prosty kodzik tworzenia i mnożenia macierzy przenieść na obiekty. Tworzę sobie dwie macierze. W konstruktorach pobierają one dane z plików i zapisują je do dynamicznych tablic wewnątrz klasy. I to działa w 100% poprawnie. Problem pojawił mi się, gdy chce napisać drugi konstruktor, który utworzy trzecią macierz mnożąc dwie już istniejące, które chce przekazać do tego konstruktora jako obiekty. I tego kompilator nie łyka. Mógłbym się was zapytać w czym źle rozumuję?

main:

int main()
{
    char name1[10]="dane.txt";
    char name2[10]="dane2.txt";
    
    Matrix Tab1(name1);
    Matrix Tab2(name2);
    
    Tab1.show();
    Tab2.show();

    Matrix Tab3(Tab1,Tab2);

    return 0;
}
 

matrix.h

 
class Matrix
{
    public:
        Matrix(char name[]);
        Matrix(Matrix tab1, Matrix tab2);

        virtual ~Matrix();
        void show();

    protected:
        
    private:
        double **M;
        int row,col,grade;
};

matrix.cpp

 
Matrix::Matrix(char name[])
{
    ifstream data(name);

    data>>row;
    data>>col;

	M = new double* [row];
	for(int k=0; k<row; k++)
		M[k] = new double [col];

    for(int i=0; i<row; i++)
    {
		for(int j=0; j<col; j++)
		{
			double x;
			data>>x;
			M[i][j] = x;
		}
    }

    if(row==col)
    {
        grade=row;
    }

    data.close();
}

Matrix::Matrix(Matrix tab1, Matrix tab2)
{  
    tab1.show();
    tab2.show();
}

Matrix::~Matrix()
{
    for(int i=0;i<row;i++)
        delete [] M[i];

    delete [] *M;
}

void Matrix::show()
{
    for(int i=0; i<row; i++)
    {
		for(int j=0; j<col; j++)
		{
			cout<<M[i][j]<<" ";
		}
		cout<<"\n";
    }
    cout<<"\n";
}
0

Oto komunikat błędu ( albo się pojawia albo czasami kompilator po prostu zwraca samo RUN FAILED (exit value 1, total time: 331ms))

  • glibc detected *** /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply: free(): invalid pointer: 0x009ebd7c ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x8c9e31]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x22)[0x2d0552]
    /usr/lib/libstdc++.so.6(_ZdaPv+0x1e)[0x2d05ae]
    /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply[0x8048ab8]
    /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply[0x8048db6]
    /lib/libc.so.6(__libc_start_main+0xe6)[0x86fce6]
    /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply[0x8048831]
    ======= Memory map: ========
    0015e000-0015f000 r-xp 00000000 00:00 0 [vdso]
    0019b000-001b8000 r-xp 00000000 fd:00 655186 /lib/libgcc_s-4.4.7-20120601.so.1
    001b8000-001b9000 rw-p 0001d000 fd:00 655186 /lib/libgcc_s-4.4.7-20120601.so.1
    00221000-00302000 r-xp 00000000 fd:00 790783 /usr/lib/libstdc++.so.6.0.13
    00302000-00306000 r--p 000e0000 fd:00 790783 /usr/lib/libstdc++.so.6.0.13
    00306000-00308000 rw-p 000e4000 fd:00 790783 /usr/lib/libstdc++.so.6.0.13
    00308000-0030e000 rw-p 00000000 00:00 0
    00629000-0062c000 r-xp 00000000 fd:00 536337 /opt/netbeans-7.0.1/dlight/tools/Linux-x86/bin/prof_agent.so
    0062c000-0062d000 r--p 00002000 fd:00 536337 /opt/netbeans-7.0.1/dlight/tools/Linux-x86/bin/prof_agent.so
    0062d000-0062e000 rw-p 00003000 fd:00 536337 /opt/netbeans-7.0.1/dlight/tools/Linux-x86/bin/prof_agent.so
    00833000-00851000 r-xp 00000000 fd:00 655081 /lib/ld-2.12.so
    00851000-00852000 r--p 0001d000 fd:00 655081 /lib/ld-2.12.so
    00852000-00853000 rw-p 0001e000 fd:00 655081 /lib/ld-2.12.so
    00859000-009e9000 r-xp 00000000 fd:00 655090 /lib/libc-2.12.so
    009e9000-009ea000 ---p 00190000 fd:00 655090 /lib/libc-2.12.so
    009ea000-009ec000 r--p 00190000 fd:00 655090 /lib/libc-2.12.so
    009ec000-009ed000 rw-p 00192000 fd:00 655090 /lib/libc-2.12.so
    009ed000-009f0000 rw-p 00000000 00:00 0
    009f2000-00a1a000 r-xp 00000000 fd:00 655182 /lib/libm-2.12.so
    00a1a000-00a1b000 r--p 00027000 fd:00 655182 /lib/libm-2.12.so
    00a1b000-00a1c000 rw-p 00028000 fd:00 655182 /lib/libm-2.12.so
    00a1e000-00a21000 r-xp 00000000 fd:00 655106 /lib/libdl-2.12.so
    00a21000-00a22000 r--p 00002000 fd:00 655106 /lib/libdl-2.12.so
    00a22000-00a23000 rw-p 00003000 fd:00 655106 /lib/libdl-2.12.so
    00a25000-00a3c000 r-xp 00000000 fd:00 655100 /lib/libpthread-2.12.so
    00a3c000-00a3d000 r--p 00016000 fd:00 655100 /lib/libpthread-2.12.so
    00a3d000-00a3e000 rw-p 00017000 fd:00 655100 /lib/libpthread-2.12.so
    00a3e000-00a40000 rw-p 00000000 00:00 0
    00a58000-00a5f000 r-xp 00000000 fd:00 655104 /lib/librt-2.12.so
    00a5f000-00a60000 r--p 00006000 fd:00 655104 /lib/librt-2.12.so
    00a60000-00a61000 rw-p 00007000 fd:00 655104 /lib/librt-2.12.so
    08048000-0804a000 r-xp 00000000 00:18 1434523750 /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply
    0804a000-0804b000 rw-p 00001000 00:18 1434523750 /afs/ericpol.int/home/l/c/lchm/home/NetBeansProjects/MatrixMultiply/dist/Debug/GNU-Linux-x86/matrixmultiply
    09dab000-09dcc000 rw-p 00000000 00:00 0 [heap]
    b774c000-b7750000 rw-p 00000000 00:00 0
    b7775000-b7778000 rw-p 00000000 00:00 0
    bfe39000-bfe4e000 rw-p 00000000 00:00 0 [stack]
1
delete [] *M

powinno być

delete[] M

Poza tym punkt (e) w podlinkowanym artykule zawiera również zdanie:

Jeśli były to błędy kompilacji - czy przy błędzie wkleiłeś linię kodu, której dotyczy?

0

Nie wkleiłem ponieważ NetBeans na Linuxie nie pokazuje mi takiej informacji.
Usunąłem ten wskaźnik z delete i teraz jako odpowiedź kompilator pokazuje mi tylko RUN FAILED (exit value 1, total time: 445ms)

1

Kompilator nie pokazuje bo RUN FAILED to nie jest błąd kompilacji tylko wykonania. Odpal w debuggerze, zobacz gdzie się sypie.

1

Nosz urwa mać! Kolejny raz to samo : /
Napiszę po raz ostatni: KONSTRUKTOR KOPIUJĄCY I OPERATOR PRZYPISANIA (The rule of three).

1 użytkowników online, w tym zalogowanych: 0, gości: 1