170 похожих чатов

А как тогда использовать деструктор без delete[]?

27 ответов

9 просмотров

нужно в первую очередь думать о "владении", то есть о том, кто в программе управляет чьим временем жизни. Если вернуться к нашим баранам, то есть классу Matrix, нужно решить, сам ли класс выделяет себе память для работы, и отвечает за неё (т.е. владеет), или только использует объекты, которые ему передают снаружи. Если задача объекта класса - получить указатель и предоставить какой-то удобный интерфейс к лежащим по нему данным, то пользовательский деструктор не нужен, при деинициализации делать просто нечего. Если же Matrix сам хранит в себе данные, и не зависит ни от каких внешних источников (кроме момента инициализации, когда эти данные ему передают, конечно), то он должен при создании сначала выделить память и скопировать туда информацию, а при уничтожении - очищать память. Извиниясюь, что сложно, не очень умею на пальцах объяснять концепции

Влад- Автор вопроса
Anton Semenov
нужно в первую очередь думать о "владении", то ест...

Я сейчас заметил, что мой деструктор перестаёт работать только при вызове функций сравнения, умножения матриц и сложения матриц. Что не так с этими функциями, можешь пожалуйста взглянуть https://pastebin.com/uKjNjayW

Влад
Я сейчас заметил, что мой деструктор перестаёт раб...

тебе как минимум нужен конструктор копирования

Влад
Я сейчас заметил, что мой деструктор перестаёт раб...

Matrix::~Matrix() { for (int i = 0; i < rows; i++) { delete[] arr[i]; } } Тут одно удаление, а выделений в конструкторе два

Влад- Автор вопроса
Ilya Zviagin
Matrix::~Matrix() { for (int i = 0; i < rows; ...

Да, я уже вернул delete[] arr; После цикла, но ошибка не только в этом

Влад
Да, я уже вернул delete[] arr; После цикла, но оши...

string Matrix::sumMatrix(Matrix _matrix) Передача по значению. Конструктора копирования нет. Следовательно, нет семантики разделения владением ресурсами выделенной памяти. Любая передача по значению сотрёт оба объекта - передаваемый, и получаемый.

Ilya Zviagin
string Matrix::sumMatrix(Matrix _matrix) Передача...

Это уже не говоря о том, что хорошо бы большие объекты передавать по ссылке...

Влад
Да, я уже вернул delete[] arr; После цикла, но оши...

string Matrix::multiplyMatrix(Matrix _matrix) string Matrix::sumMatrix(Matrix _matrix) Почему результат умножения матриц - вдруго строка? Почему аргументы не const ?

Влад- Автор вопроса
Ilya Zviagin
string Matrix::sumMatrix(Matrix _matrix) Передача...

Спасибо большое, передача по ссылке решила проблему

Влад
Спасибо большое, передача по ссылке решила проблем...

НЕТ! не решила, а скрыла! Проблема никуда не делась!

Влад- Автор вопроса
Ilya Zviagin
string Matrix::multiplyMatrix(Matrix _matrix) str...

const препод запретил использовать. Строка, потому что препод хочет чтоб пользователь увидел предупреждение, если действие с матрицами сделать нельзя

Влад
const препод запретил использовать. Строка, потому...

Предупреждения делаются исключениями, а не строками.

Влад
const препод запретил использовать. Строка, потому...

А про CONST - я уверен, что ты что-то не так понял.

Влад- Автор вопроса
Ilya Zviagin
НЕТ! не решила, а скрыла! Проблема никуда не делас...

Чтоб решить проблему, нужно использовать конструктор копирования?

Влад
Возможно

И вот что это за порно? string Matrix::determinant() string Matrix::sumMatrix(Matrix _matrix) string Matrix::multiplyMatrix(Matrix _matrix) int** Matrix::multiplyByNum(int n) Все операции неправильные. У всех какая-то идиотская семантика, судя по сингнатурам. Переделывай. Ошибки надо возвращать через исключения. Все методы, не меняющие данные , должны быть константными. Каждый метод для векторной операции должен возвращать другую матрицу, по значению. (для этого надо определять конструктор копирования и оператор присваивания) А скалярные операции должны возвращать тот же тип, что и элемент матрицы. Матрицы целых практически бесполезны, надо либо делать float/double , либо делать шаблон с шаблонным параметром-типом вместо int

Влад
Чтоб решить проблему, нужно использовать конструкт...

string Matrix::determinant() { /// // temporary array for storing row int* temp = new int[rows + 1]; Где освобождение ?

Влад- Автор вопроса
Ilya Zviagin
string Matrix::determinant() { /// // temporar...

Оно разве не удаляется после завершения функции?

Влад
Оно разве не удаляется после завершения функции?

Matrix::Matrix(int r_count, int c_count, int num...) Это что за п..... — не заметил сразу .... Это вообще лютый пиздец, если не умеешь с элипсисом работать — не берись, Да и без него надо было бы делать, а от initializer list

Влад- Автор вопроса
Влад
Это лучше удалить?

Это просто ацкий угар...

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта