Мне не нравятся вопросы с отладочными сеансами и вставленными указателями памяти, но я вынужден задавать один такой.Это вопрос о вызове конструкторов копирования.Я знаю, что уже есть ответы на этот вопрос, но я не нашел ничего, что решило бы мою проблему
У меня есть класс Matrix:
class Matrix {
...
Matrix(const Matrix& other); // copy constructor, needed due to *data
private:
int *data;
};
Matrix содержит указатель на статическую памятьмассив data
, поэтому, когда я копирую матрицу, статический массив также должен быть скопирован с mempy
.
. В какой-то момент я хочу скопировать объект матрицы в другую матрицу
debug("COPY BEGIN ");
debug("matricex before copy: " << &itsMatrix << " < " << &matrix);
itsMatrix = matrix;
debug("COPY END ");
debug("matricex after copy: " << &itsMatrix << " < " << &matrix);
Конструктор копирования должен быть вызван для копирования data
.По-видимому, вместо вызова конструктора копируются только значения указателей;позже, когда обе матрицы памяти удалены, один и тот же указатель на data
удаляется дважды, и у меня возникает ошибка seg
Вот сеанс отладки:
1: Matrix.cpp MATRUX EMPTY 0xbf901a28 with empty data 0
2: include/SubArrayMax.hpp COPY BEGIN
3: include/SubArrayMax.hpp matricex before copy: 0xbf901a28 < 0xbf901a3c
--- here I should see a copy constructor ---
--- but no debug string is printed ---
4: include/SubArrayMax.hpp COPY END
5: include/SubArrayMax.hpp matricex after copy: 0xbf901a28 < 0xbf901a3c
6: Matrix.cpp DELETE MATRIX 0xbf901a28 with data 0x81d0550
7: Matrix.cpp DELETE MATRIX 0xbf901a3c with data 0x81d0550
--- 0x81d0550 is deleted twice ---
и это мой конструктор копирования:
Matrix::Matrix(const Matrix& other) // copy construcutor
{
...
data = new mval_t[dim.w * dim.h];
memcpy(data, other.data, dim.w * dim.h * sizeof(mval_t));
debug("MATRIX " << this << " after copying, data " << data);
}
Я знаю, что конструкторы копирования могут быть уменьшены компилятором, я пробовал -fno-elide-constructors
, и у меня также была ошибка seg.
Любой намек, почему это происходит?или, может быть, есть лучший способ справиться с копированием объектов с побочными эффектами?