1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
|
||||||
1 | ||||||
Выделение динамической памяти для двумерного массива.16.04.2010, 19:26. Просмотров 48711. Ответов 23
Метки нет Все метки)
(
![]()
2
|
|
16.04.2010, 19:26 | |
Выделение динамической памяти для массива точек Выделение динамической памяти для массива внутри функции Правильное выдиление динамической памяти для двумерного массива Выделение памяти для двумерного массива |
|
167 / 94 / 11
Регистрация: 16.04.2010
Сообщений: 464
|
|
16.04.2010, 19:32 | 2 |
надо выделить сначала массив указателей, а потом к каждому указателю прилепить по массиву чисел
2
|
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
|
|
16.04.2010, 19:35 [ТС] | 3 |
Спасибо, можно листинг?
0
|
![]() 3940 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||||
16.04.2010, 19:37 | 4 | |||||
![]() Решение
neske,
10
|
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
|
|
16.04.2010, 19:40 [ТС] | 5 |
Проверил, работает, спасибо.
0
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
|||||||||||
04.05.2010, 07:21 | 6 | ||||||||||
у меня встречный вопрос, чтоб уже добить эту тему:
освобождение правильное освобождение памяти: у вашем примере вы освобождаете память с помощью такой конструкции:
Тоесть не надо делать то, что вы писали а достаточно только написать вот так:
0
|
Модератор
![]() ![]() ![]() ![]() 10871 / 6759 / 1619
Регистрация: 25.07.2009
Сообщений: 12,483
|
|
04.05.2010, 09:14 | 7 |
msangel, странный учебник. MiCr0s0fT правильно написал - по сути каждый элемент массива mas сам по себе является указателем на массив. И память для каждого из них была выделена оператором new[], соответственно должна быть возвращена оператором delete[]. Я в нескольких умных книжках читал, что возвращать нужно ровно столько памяти, сколько брал. И как-то такой подход кажется более правильным, чем упование на то, что для каждого элемента массива указателей mas сам собой оператор delete[] будет вызван, а не просто потеряется указатель на выделенную память. Кстати, а что за учебник?
1
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
|
04.05.2010, 09:30 | 8 |
что за учебник не скажу
![]() но в продолжение темы: как узнать, что происходит утечка памяти?
0
|
![]() 3940 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||||
04.05.2010, 10:18 | 9 | |||||
msangel, easybudda, а я бы тоже не прочь узнать, что за учебник такой, кто так людей учит ... (судя по всему, обучалка для какой-нибудь современной IDE, где пользователь уже забыл, что значит "освободить память" - всё сделает машина)
И ещё интересно... а про обнуление в этом учебнике ничего не сказано? Архангельский и Либерти, например, рекомендуют после высвобождения памяти производить обнуление значений. То есть, для примера:
У неё есть механизм анализа кода, который предупреждает, например, о том, что переменная была обьявлена, но нигде не использовалась... Так вот, начинаю разработку проекта. Режим Debug. Выделил память, попользовался ею, очистил. Обнулил. Компильнул - всё идеально. Переключаюсь на Release. Компилирую тот же код и получаю Warning'и в местах обнуления. Предупреждение о том, что переменная больше нигде не используется. Вот такие вот интересности из учебников...
0
|
Модератор
![]() ![]() ![]() ![]() 10871 / 6759 / 1619
Регистрация: 25.07.2009
Сообщений: 12,483
|
|
04.05.2010, 11:16 | 10 |
Ну в принципе-то правильно рекомендуют. Суть в том, что если в программе после того, как память была возвращена оператором delete / free и значение указателя установлено в NULL, пытаясь по ошибке использовать тот же указатель программа грохнется с исключением типа "NULL pointer bla bla bla...". А вот если указатель не был установлен в NULL, программа будет пытаться использовать уже не инициализированный участок памяти, и вот тут поведение её не предсказуемо. Так, что, это просто мера предосторожности такая, но вполне разумная...
0
|
![]() 3940 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
04.05.2010, 23:54 | 11 |
easybudda, да, о мере предохранении от AV я осведомлён. Мне интересен сам факт, почему компилятор предупреждает о повторном использовании только что высвобожденного куска памяти. Не верится мне, что разработчики не учли случай "аккуратного" повторного использования того же участка памяти. (и именно в Release варианте сборки)
Возможно, существует какой-то другой рациональный метод ... В данном случае мною движет чисто профессиональный интерес. Завтра посмотрю, что скажет по этому поводу Visual Studio...
0
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
||||||
05.05.2010, 00:35 | 12 | |||||
а если остается доступной, то толку от этой чистки? или может это потому, что оператор [] обеспечивает лиш доступ по смещению памяти и никаких проверок на доступность памяти не делает(в случае недоступности должна возбуздается ошыбка) но ее нет и все работает приведеный ниже код:
Код
26 Почему так?
0
|
Модератор
![]() ![]() ![]() ![]() 10871 / 6759 / 1619
Регистрация: 25.07.2009
Сообщений: 12,483
|
||||||
05.05.2010, 00:47 | 13 | |||||
MiCr0s0fT, я думаю - всё проще. При релизной сборке какой-нибудь варн-левел повышается, и компилятор отслеживает случаи, когда после последнего изменения значения переменной она нигде больше не используется. Наверное, это одно из множества параноидальных предупреждений, на которые можно просто внимание не обращать. Ну или отключить, чтоб граза не мозолило...
Вот к примеру код
На собственные заголовочные файлы ругается. Что ж теперь, stdio.h "испралять"? ![]()
0
|
Модератор
![]() ![]() ![]() ![]() 10871 / 6759 / 1619
Регистрация: 25.07.2009
Сообщений: 12,483
|
|||||||||||
05.05.2010, 00:51 | 14 | ||||||||||
msangel, попробуйте после
0
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
|
05.05.2010, 01:07 | 15 |
да, как я уже писал
но вопрос как раз не в том. вопрос состоит так:
0
|
536 / 352 / 47
Регистрация: 05.04.2009
Сообщений: 730
|
||||||
05.05.2010, 02:19 | 16 | |||||
msangel,
Еще прикольный вариант [-15]
0
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
|||||||||||||||||||||
05.05.2010, 05:37 | 17 | ||||||||||||||||||||
да, это как минимум странно
![]() я решил посмотреть как в таких случаях меняются адреса
получается я могу розмещать в памяти за нужным мне адресом нужные объекты, если придумаю способ их сериализации в память? конешно, возможно такой способ выделения памяти опасен тем, что приложение может по моих адресах разместить свои даные... хотя я об етом ничего не знаю... как приложение управляет своей памятью? наверное у каждого приложения во время роботы создается таблица, где оно хранит используемые адреса, чтоб при динамичесском выделении памяти просто не писать поверх и указывать на свободные участки? возможно даже функции malloc/free и операторы new/delete и соответственно работают с такой таблицей? или это в конце концов просто баг компилятора? ![]() Добавлено через 22 минуты да, я был прав ![]() http://www.parashift.com/c++-f... l#faq-38.8 там написано об том, как выделяется динамеческая память как я и предполагал - объекты пишутся прамо в память по смещению относительно указателя
for (i = 0; i < n; ++i) new(p + i) Fred(); - запись одного елемента по смещению но самое интерестное тут: arrayLengthAssociation.insert(p, n); в хелпе написано, что: а в реализации все делается наоборот: // Original code: delete[] p;
гм) теперь все логично. именно поэтому мы свободно можем писать в любую (свободную) точку памяти. всем спасибо за помощь. Добавлено через 14 минут нет следовательно должен быть еще что-то, но уже с адресами Добавлено через 23 минуты так же было б интерестно узнать, как виделяется память под одну переменную\\ наверно программа просит об этом операционную систему однако что то не могу найти таких исходников\\ Добавлено через 24 минуты оу, уже нашел))) http://en.wikipedia.org/wiki/Memory_pool в ссилках под статьей интерестный исходник и наверное выделеная таким образом память плюсуется к памяти приложения, расшыряя его адресное пространство за это наверное тоже отвечают функции malloc/free и операторы new/delete - кроме всего они еще при необходимости запрашуют еще блок памяти или освобождают его)))) жаль, что передо мной не стоит задача написать собственный менеджер памяти ![]()
0
|
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
|
|||||||||||||||||||||
05.05.2010, 12:20 | 19 | ||||||||||||||||||||
тема же об так как в даном примере в
поетому сначала удалаятся ппамять из под объектов, на которые ссылаются указатели:
0
|
536 / 352 / 47
Регистрация: 05.04.2009
Сообщений: 730
|
||||||
05.05.2010, 12:27 | 20 | |||||
msangel, они там точно прикалывались -> &(i[matr2])
![]()
0
|
05.05.2010, 12:27 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Динамическое выделение памяти для двумерного массива
Выделение динамической памяти для char Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |