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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 17:19   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию удаление динамических массивов

Вроде все делаю правильно но во время работы прога выдает ошибку. Очевидно неправильно удаляю массив (удаляю не выделенную память)
Код:
for (int i = 0; i < yy; i++)
	{
		uu[i] = new unsigned char[16];//блоки 
		for(int j = 0; j < 16; j++)
		{
			uu[i][j] = iCount;
			iCount++;
		}
	}
for(int j = 0; j < yy; j++)
		delete[] uu[j];
	delete [] uu;
From Stilet: Еще раз код не выделишь тегом - недельную командировку получишь.

Последний раз редактировалось Stilet; 12.03.2011 в 08:22.
Dimarik вне форума Ответить с цитированием
Старый 11.03.2011, 17:45   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

А можно полностью кусок кода с объявлением динамического массива? Подозреваю, что проблема там...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 11.03.2011, 17:54   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

unsigned char ** unsCharArray = new unsigned char*[yy];//массив блоков

а вот такое как правильно удалить?
Код:
	int *** dynamic = new int**[5];
	for (int i = 0; i < 5; i++)
	{
			dynamic[i] = new int*[4];
			for (int j = 0; j < 4; j++)
			{
				dynamic[i][j] = new int[7];
				for(int k = 0; k < 7; k++)
					dynamic[i][j][k] = k;
			}
	}
и правильно ли я его создаю?

Последний раз редактировалось Stilet; 12.03.2011 в 08:22.
Dimarik вне форума Ответить с цитированием
Старый 11.03.2011, 18:23   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Код:
    int yy;
    int iCount = 48;    // десятичный ASCII код символа "0"
    cin >> yy;

    unsigned char **unsignedCharArray = new unsigned char *[yy];
    
    for (int i = 0; i < yy; i++)

        {
        unsignedCharArray[i] = new unsigned char[6];//блоки
        for(int j = 0; j < 6; j++)
            {
            unsignedCharArray[i][j] = iCount;
            iCount++;
            }
        }

    for (int i = 0; i < yy; i++) delete[]unsignedCharArray[i];
    delete[]unsignedCharArray;
Это по поводу двумерного массива. Вроде бы, я нигде не напортачил?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 11.03.2011 в 18:29.
Mandrivnyk вне форума Ответить с цитированием
Старый 11.03.2011, 18:27   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

А как с трёхмерным быть?
Dimarik вне форума Ответить с цитированием
Старый 11.03.2011, 18:29   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
А как с трёхмерным быть?

Уничтожение трёхмерного массива требует дополнительного цикла. Принцип тот же.

Код:
for (i = 0; i < 4; i++)
{
    for (j = 0; j < 7; j++) delete[]dynamic[i][j];  
}
for (i = 0; i < 5; i++) delete[]dynamic[i];
delete[] dynamic;
Надеюсь, ничего не перепутал...

Естественно, подразумевается, что 4, 7 и 5 (размерности массива) -- именно некие переменные, иначе нет смысла связываться с динамическими массивами -)

ЗЫ Всех с Пятницей! -))
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 11.03.2011 в 18:40.
Mandrivnyk вне форума Ответить с цитированием
Старый 11.03.2011, 20:33   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Код:
const int n=10;
const int m=10;
const int z=10;

int i,j;

int*** matr;

matr = new int**[n];
for (i=0; i<n; i++)
matr[i] = new int*[m];

for (i=0; i<n; i++)
for (j=0; j<m; j++)
matr[i][j] = new int[z];


for (i=0; i<n; i++)
for (j=0; j<m; j++)
delete matr[i][j];

for (i=0; i<n; i++)
delete[] matr[i];

delete[] matr;
3-х мерный динамо массив

upd: поправил

Последний раз редактировалось onewho; 12.03.2011 в 00:39.
onewho вне форума Ответить с цитированием
Старый 11.03.2011, 20:57   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!

for (i = 0; i < 5; i++) delete[]dynamic[i];
delete[] dynamic;
зачем тут цикл? и почему нельзя написать просто последнюю строчку?

Посмотрел в отладчике. Кажется, я не до конца очистил память:
Код:
//очищаем память
	for(int j = 0; j < 4; j++)
	{
		for (int k = 0; k < 4; k++)
			delete[] unsCharArray[j][k];
		delete[] unsCharArray[j];
	}
	delete [] unsCharArray;
массив создавался размерностью unsCharArray[I_][J_][K_]в счётчике использовал названия переменных похожие на названия переменных, определяющих размерность массива чтобы понятнее было что к чему. Правильно ли я удаляю? Потому что кажись не до конца тут удалено

сТРАННО. Сейчас ошибка: обращение по невыделенной памяти access violantation
Код:
for(int j = 0; j < 4; j++)
	{
		for (int k = 0; k < 4; k++)
			delete[] unsCharArray[j][k];//вот тут ошибка при j =2; k = 0
		delete[] unsCharArray[j];
	}
	delete [] unsCharArray;
Но что самое интересное, вот такой кусок кода перед удалением работает нормально!!!
Код:
for (int i = 0; i < _iBlocks; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			for (int k = 0; k < 4; k++)
				fObject<<int(unsCharArray[i][j][k])<<'\t';
		}
		fObject<<endl;
	}

Последний раз редактировалось Stilet; 12.03.2011 в 08:24.
Dimarik вне форума Ответить с цитированием
Старый 12.03.2011, 00:19   #9
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
for (i = 0; i < 5; i++) delete[]dynamic[i];
delete[] dynamic;
зачем тут цикл? и почему нельзя написать просто последнюю строчку?
Как ты уже сам понял, организация трехмерного динамического массива производится в три этапа.
Сначала создается одномерный массив указателей (i), потом каждому элементу этого массива присваивается адрес двумерного массива, который (массив) также является массивом указателей (j), каждый из которых указывает уже на одномерный массив указателей (k).
Таким образом, первый из созданных массивов (i) является массивом указателей на указатели на указатели.
Немного запутано -- пятница, все-таки -) -- но, думаю, идея понятна.

При удалении надо освободить память в обратном порядке.
Вначале освобождается память, выделенная под массив (k) -- двойным циклом по индексам (j) и (i).
Затем -- память, выделенная под массив (j) -- циклом по индексу (i).
И только в самом конце -- память, выделенная под массив (i). Цикл не нужен.

Чтобы убедиться в этом -- просто посчитай, для скольких элементов ты вызвал оператор new() и сравни с числом вызовов оператора delete().
Насколько я понимаю, количество вызовов должно быть равно.

Именно поэтому ты и получал ошибку Access Violation

Я ответил на твой вопрос?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 12.03.2011, 17:07   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Я сделал всё как ты мне сказал, но он кажись не удалился.
Код:
int _tmain(int argc, _TCHAR* argv[])
{ 
	
	int iCount = 0;
	int *** dynamic = new int**[5];
	for (int i = 0; i < 5; i++)
	{
			dynamic[i] = new int*[6];
			for (int j = 0; j < 6; j++)
			{
				dynamic[i][j] = new int[7];
				for(int k = 0; k < 7; k++)
				{
					dynamic[i][j][k] = iCount;
					iCount++;
				}
			}
	}
	
	fstream file;
	file.open("C:\\file.txt", ios::out);
	for (int i = 0; i <  5; i++)
	{
		for (int j = 0; j < 6; j++)
		{
			for (int k = 0; k < 7; k++)
			{
				file<<"dynamic["<<i<<"]["<<j<<"]["<<k<<"] = "<<dynamic[i][j][k]<<"\t";
			}
			file<<endl;
		}
		file<<endl;
	}
	for (int i = 0; i < 5; i++)
		for(int j = 0; j < 6; j++)
			delete[] dynamic[i][j];
	for (int i = 0; i < 5; i++)
		delete[] dynamic[i];
	delete[] dynamic;
	return 0;
}
Изображения
Тип файла: png Снимок.PNG (36.4 Кб, 151 просмотров)
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка динамических массивов в Си тина сорока Помощь студентам 2 26.02.2010 00:39
Delphi передача динамических массивов world12_tk Помощь студентам 7 23.12.2009 21:06
обработка динамических массивов funky Помощь студентам 0 11.05.2009 17:53
C++. Объявление динамических массивов. Парсифаль Помощь студентам 27 03.05.2009 23:21