Написал свои классы матриц и векторов. Написал для них конструкторы копирования, все как обычно, методы должны для возврата результатов использовать конструктор копирования. Например, сигнатура оператора умножения матриц: 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)
- Форум Это заслуга умного компилятора? (2019)
- Форум Свой класс Any (2014)
- Форум Использование placement new (2014)
- Форум Конструктор копирования в gcc (2009)
- Форум конструктор копирования (2014)
- Форум Конструктор копирования (2022)
- Форум C++ конструктор копирования (2016)
- Форум PIMPL без указателя (2016)
- Форум gcc и копирующий конструктор. (2010)