информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСетевые кракеры и правда о деле ЛевинаВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
самый лучший способ познания - это эксперемент. 29.07.02 11:43  Число просмотров: 970
Автор: PS <PS> Статус: Elderman
Отредактировано 29.07.02 12:01  Количество правок: 1
<"чистая" ссылка>
#include <stdio.h>

void main()
{
const int size = 1000;

char* p = new char[1000];
printf( "p1: %x\n", p );
char* p2 = new char[1000];
printf( "p2: %x\n", p2 );
char* p3 = new char[1000];
printf( "p3: %x\n", p3 );
delete[] p;
p = new char[size];
printf( "p1: %x\n", p );
char* p4 = new char[10];
printf( "p4: %x\n", p4 );
}

Попробуй поэксперементировать с size. Сразу все поймешь.
И еще. Работа с кучей полностью лежит на компиляторе. Так что, как будет происходить работа с "дырками" зависит от него.
Мне не попадались компиляторы которые пытались бы дефрагментировать память.
<programming>
[C++] Поясните начинающему программисту принцип организации работы с памятью в С 29.07.02 10:52  
Автор: Naser Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Сразу оговорюсь, хотел бы услышать нормальный ответ, а не указания на то что я ламер. Просто пытаюсь разобраться.
Допустим, я распределил динамически (new) память под N элементов массива. И допустим, я повторил эту операцию несколко раз. Затем в процессе работы программы я освобождаю память (delete),занятую одним из массивов. Получается, как бы, образуются свободные ячейки памяти посреди распределенных участков. Может быть, я использую неверную терминологию, поэтому прошу заранее меня извинить. Главное, чтобы меня поняли. Программа пишется под WinNT. Хотелось бы получить пояснение, как в дальнейшем система реагирует на подобные фрагментированные участки памяти. Что происходит, если я снова динамически распределю N ячеек памяти. Будут ли заняты освобожденные ранее ячейки и как все это отслеживается системой. Буду признателем любым заинтересованным ответам
[C++] Очень признателен всем участвовавшим в обсуждении... 31.07.02 10:06  
Автор: Naser Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Судя по количеству просмотров, тема оказалась интересной многим...
Буду рад дальнейшему общению...
[C++] Поясните начинающему программисту принцип организации работы с памятью в С 29.07.02 15:28  
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
...
> происходит, если я снова динамически распределю N ячеек
> памяти. Будут ли заняты освобожденные ранее ячейки и как
> все это отслеживается системой. Буду признателем любым
> заинтересованным ответам

Любой пропуск в динамической памяти может быть заполнен впоследствии подходящим по размеру новым объектом, как конкретно - зависит от компилятора (точнее, его
run-time library). Насколько я себе это преставляю, если при выделении нового объекта в динамической памяти нет лакуны в точности требуемого размера, происходит одна из двух вещей: используется часть лакуны большего размера (с таким расчетом, чтобы свободный остаток был бы на что-нибудь пригоден), или выделяется дополнительная память за счет увеличения heap. Нет НИКАКОЙ гарантии,
что следующий за delete оператор new (с тем же размером) вернет ТОЛЬКО ЧТО освободившуюся память.

Есть еще один момент - физическое наличие или отсутствие удаленной через delete памяти в адресном пространстве процесса. Вполне возможно, что небольшого размера объекты удаляться из адресного пространства не будут (т.е. занятая ими память по-прежнему доступна для чтения/записи). Достаточно большие объекты удаляются с исключением из heap (проверил на массиве в 50Мб под VC++ 6.x - сразу после выполнения delete размер свободной физической памяти вырастает на 50 мег). В этом случае содержание освобожденной памяти потеряно - при повторном выделении памяти в этом же месте адресного пространства там могут во-первых оказаться совсем другие физические страницы (зависит целиком от операционной системы), и во-вторых в случае с WinNT содержимое этих страниц все равно зануляется.
самый лучший способ познания - это эксперемент. 29.07.02 11:43  
Автор: PS <PS> Статус: Elderman
Отредактировано 29.07.02 12:01  Количество правок: 1
<"чистая" ссылка>
#include <stdio.h>

void main()
{
const int size = 1000;

char* p = new char[1000];
printf( "p1: %x\n", p );
char* p2 = new char[1000];
printf( "p2: %x\n", p2 );
char* p3 = new char[1000];
printf( "p3: %x\n", p3 );
delete[] p;
p = new char[size];
printf( "p1: %x\n", p );
char* p4 = new char[10];
printf( "p4: %x\n", p4 );
}

Попробуй поэксперементировать с size. Сразу все поймешь.
И еще. Работа с кучей полностью лежит на компиляторе. Так что, как будет происходить работа с "дырками" зависит от него.
Мне не попадались компиляторы которые пытались бы дефрагментировать память.
[C++] Поясните начинающему программисту принцип организации работы с памятью в С 29.07.02 11:18  
Автор: VisUAll Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Хотелось бы получить пояснение, как в дальнейшем система
> реагирует на подобные фрагментированные участки памяти. Что
> происходит, если я снова динамически распределю N ячеек
> памяти. Будут ли заняты освобожденные ранее ячейки и как
> все это отслеживается системой. Буду признателем любым
> заинтересованным ответам

читай:
http://www.citforum.ru/koi/operating_systems/sos/contents.shtml
2.x управление памятью

не совсем C++, но тоже не помешает
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach