Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2015, 16:55   #1
apk
Новичок
Джуниор
 
Регистрация: 01.12.2015
Сообщений: 2
По умолчанию Удаление динамического массива из памяти С++

Создание класса для работы с матрицами. Сложение матриц.

Код:
#include <iostream>
#include <time.h>
using namespace std;
class Matrix
{
	int** mas;
	int size;
public:
	Matrix(int n) : size(n)
	{
		mas = new int*[size];
		for (int i = 0; i < size; ++i)
			mas[i] = new int[size];
		for (int i = 0; i < size; ++i)
			for (int j = 0; j < size; ++j)
				mas[i][j] = rand() % 10;
	}
	~Matrix()
	{
		for (int i = 0; i < size; ++i)
			delete mas[i];
		delete[] mas;
	}
	void Show()
	{
		for (int i = 0; i < size; ++i)
		{
			for (int j = 0; j < size; ++j)
				cout << mas[i][j] << "\t";
			cout << endl;
		}
		cout << "-----------------------------\n";
	}	
	int* operator[](int k)
	{
		return mas[k];
	}
	Matrix operator + (const Matrix& c)
	{
		Matrix tmp(size);
		for (int i = 0; i < size; ++i)
			for (int j = 0; j < size; ++j)
				tmp[i][j] = mas[i][j] + c.mas[i][j];
		return tmp;
	}
};
void main()
{
	Matrix x(4), y(4), c(4);
	x.Show();
	y.Show();
	c = x + y;
	c.Show();
}
Вылетает с ошибкой: Необработанное исключение по адресу 0x54E2A9E8 (msvcr120d.dll) в DZ06_01.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEE2.

и указывает на строку delete mas[i] в деструкторе.
Подскажите, что не правильно. Спасибо.

Последний раз редактировалось Аватар; 13.12.2015 в 17:38.
apk вне форума Ответить с цитированием
Старый 13.12.2015, 16:57   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Конструктор копий сделайте (и оператор присваивания тоже).
Croessmah вне форума Ответить с цитированием
Старый 14.12.2015, 07:57   #3
apk
Новичок
Джуниор
 
Регистрация: 01.12.2015
Сообщений: 2
По умолчанию

Добавил
Код:
Matrix(const Matrix &c)
	{
		for (int i = 0; i < size; ++i)
			for (int j = 0; j < size; ++j)
				mas[i][j] = c.mas[i][j];
	}
Matrix &operator = (const Matrix &c)
	{
		for (int i = 0; i < size; ++i)
			for (int j = 0; j < size; ++j)
				mas[i][j] = c.mas[i][j];
		return *this;
	}
теперь ошибка в строке mas[i][j] = c.mas[i][j]; (operator=)
Необработанное исключение по адресу 0x012E43B5 в DZ06_01.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC.

Последний раз редактировалось Stilet; 14.12.2015 в 12:23.
apk вне форума Ответить с цитированием
Старый 14.12.2015, 08:13   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Чему у вас равен size на момент вызова этих методов? А фиг его знает... Где проверка, что размеры совпадают? А если не совпадают, то реалок или пресоздание массивов?
p51x вне форума Ответить с цитированием
Старый 14.12.2015, 09:19   #5
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

А память под матрицу в копии кто будет выбелять?
Ну и в операторе присваивания, как уже написали, проверка размеров нужна и в случае чего - перевыделять.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента динамического массива mrCloud Общие вопросы Delphi 7 03.11.2012 12:31
Удаление строки из двумерного динамического массива hidraulik Общие вопросы C/C++ 0 08.12.2009 10:48
Удаление динамического массива Сергей089 Общие вопросы C/C++ 3 08.03.2009 13:13
Удаление элементов из динамического массива dashulka Общие вопросы Delphi 4 31.10.2008 14:03
Удаление элемента динамического массива Dogmat Помощь студентам 6 13.07.2008 14:33