2012-06-07 4 views
0
Mat::Mat(int R, int C) 
{ 
    Ar = new int[C*R]; 
    Co = C; 
    Ro = R; 
} 

Mat::~Mat() 
{ 
    delete[] Ar; 
} 

Тем не менее, я получаю сигнал SIGABRT на этом «удалении».сигнал SIGABRT, хотя я использую delete [] в C++

EDIT:
Я использую Xcode, и я пытался добавить жесткий конструктор копирования. Я все еще получаю эту ошибку в удаление []:

Mat::Mat(int R, int C) 
{ 
    Ar = new int[C*R]; 
    Co = C; 
    Ro = R; 
} 

Mat::Mat(const Mat& M): Co(M.Co), Ro(M.Ro) 
{ 
    Ar = new int[M.Co*M.Ro]; 
    for (int i = 0; i<(M.Co*M.Ro); i++) { 
     Ar[i] = M.Ar[i]; 
    } 
} 

Mat::~Mat() 
{ 
    delete[] Ar; 
} 
+0

вы создаете объект 'Mat' в любом месте, не используя пользовательский конструктор? –

+0

Я уверен, что это можно решить, используя std :: vector вместо int *. – stefaanv

+0

Предположим, вы не внедрили правильный конструктор копий и оператор-ассистент? –

ответ

6

Это больше психической отладки, но я убежден, в значительной степени, это является основной причиной:
Вы должны следовать Rule of Three.
Вы должны предоставить собственный конструктор копирования и оператора присваивания копии для класса Mat, которые делают глубокую копию указателя.

Если у вас нет пользовательских версий для вышеупомянутых функций, тогда динамическая память, выделенная элементу-указателю Ar, будет освобождена всякий раз, когда создается и уничтожается временная копия вашего объекта класса, в конце концов вы остаетесь с зависающим элементом указателя и наконец, вызывается delete [], что приводит к Неопределенное поведение и авария.

+0

Я пробовал, но это не поможет! –

+0

@MichaelMirkin 'Ar (M.Ar)' И именно в этом проблема. Он просто копирует указатель, но он должен выделить новое хранилище для 'Ar' и скопировать фактические данные. Речь идет не о том, чтобы просто реализовать тривиальный конструктор копии, компилятор может (и будет) делать это тоже. Вы, конечно же, должны его правильно реализовать. Если вы не знаете, как это сделать, ознакомьтесь с некоторыми вводными материалами по указателям и распределению динамической памяти. –

+0

@MichaelMirkin: В самом деле проблема заключается в том, что ваш конструктор копий делает ** Shallow copy ** (* просто указывает член точки нового объекта, который строится на память, выделенную для элемента-указателя объекта, через который он построен *). a ** Deep Copy **, он должен выделить память для элемента-указателя объекта, который будет сконструирован, а затем скопировать содержимое памяти, указанное указателем-членом объекта, переданным в качестве входного аргумента в cctor. –

1

Если где-нибудь в вашем коде у вас есть что-то вроде этого:

{ 
Mat A(R1,C1);//create A.Ar 
MAT B(A);//now B.Ar will point to A.Ar array 
}//delete will be called twice for the same array 
Смежные вопросы