Написал свои классы матриц и векторов. Написал для них конструкторы
копирования, все как обычно, методы должны для возврата результатов
использовать конструктор копирования. Например, сигнатура оператора
умножения матриц:
Matrix operator*(Matrix &).
Все работает вроде нормально, но когда я добавил матрицам имена
(например, Matrix a(3,3, "a")) и начал следить за временем жизни
объектов (добавив в конструкторы, деструкторы и операторы вывод
сообщений о выполняемых действиях) заметил что временные объекты ведут
себя не так как я ожидал. Например, в операторе сложения (без
проверок):
Matrix Matrix::operator+(Matrix &m) {
cout << mName << "::operator+(" << m.mName << ")" << endl;
Matrix t(mRow, mCols, "temp" /* имя генерируется случайной
последовательностью латинских символов */);
t += m;
return t;
}
Теперь к примеру для следующего кода:
Matrix a(3,3, "a"), b(3,3, "b"), c(3,3, "c");
c = a + b;
будет выведены сообщения:
Matrix "a" created
Matrix "b" created
Matrix "c" created
a::operator+(b)
Matrix "kdjlkj" created
c::operator=(kdjlkj)
Matrix "kdjlkj" destroyed
Matrix "c" destroyed
Matrix "b" destroyed
Matrix "a" destroyed
Т.е. получается после того как оператор+ создал временный объект в
стеке, он его не уничтожил при выходе. При возврате из метода не был
вызван конструктор копирования (в нем также есть вывод сообщений),
т.е. что получается? Аргументом оператора= был объект из стека,
который должен быть по идее уже переписан данными при вызове
присваивания? Что вообще происходит?
Ответ на:
комментарий
от dilmah
Ответ на:
комментарий
от sotlef

Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум С++ и правило нуля (2019)
- Форум Копирование объекта при возврате из функции(C++) (2008)
- Форум Свой класс Any (2014)
- Форум Это заслуга умного компилятора? (2019)
- Форум Использование placement new (2014)
- Форум Конструктор копирования в gcc (2009)
- Форум Конструктор копирования (2022)
- Форум конструктор копирования (2014)
- Форум C++ конструктор копирования (2016)
- Форум PIMPL без указателя (2016)