Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделенение и освобождение RAM разными способами, в классе 
V
    Опции темы
EvgenZ
Дата 16.11.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



почему-то не склеился...

Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 17:57


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
vinter
Дата 16.11.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

Почему не ругается на return size = сhanged_array;  

а почему он должен ругатся??
Цитата

 Почему тогда size куда-то указывает?

ф-ия вернула указатель, и локальный указатель удалился, но память то никуда не делась! теперь array указывает на память выделенную в ф-ии..


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 16.11.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Цитата(EvgenZ @  16.11.2006,  17:04 Найти цитируемый пост)
т.е. это получается, что создается временный changed_array который присваивается в main size'у и потом удаляется? Почему тогда size куда-то указывает? Почему не ругается на return size = сhanged_array;   ?

все таки очень ты оригинально читаешь код. прочитай еще раз. и попробуй задавать вопросы по коду. smile
PM MAIL   Вверх
Xenon
Дата 17.11.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



EvgenZ Ты же в куче создаешь массив, а не в стеке. Созданый в куче массив умрет только тогда, когда скажешь (delete [] ...), а указатель, когда закончится блок, в котором он объявлен. 


--------------------
user posted image  
PM MAIL   Вверх
Oleg_Ci
Дата 17.11.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Цитата
// нужна защита в случае когда размер нового массива меньше старого
тогда надо так ...
Код

//#include <cstring>
template <typename T>
T * _realloc( T *& array, const unsigned int size, const unsigned int new_size ){
    T * a = new T [ new_size ];
    memcpy( a, array, sizeof(T) * ( size < new_size ? size : new_size )); 
    delete [] array;
    return array = a;
}

PM MAIL   Вверх
EvgenZ
Дата 17.11.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



С указателем я тупанул, почему-то решил, что он в функции увеличения создан  smile , а не в мэйне, хз почему. 

Xenon, после твоего поста стало все понятно, что-то я вообще не туда думал  smile , спасибо.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Rockie
Дата 17.11.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



EvgenZ, закомментировал

Код
// эта функция принмает указатель на исходный массив, рамер исходного массива, и размерность нового массива
int* ResizeArray(int * array, int size, int new_size)  
 {
// здесь мы создаем указатель на новый массив int-ов и выделяем для него память, равную new_size.
// то есть указатель changed_array указывает(масло масляное :)) на адрес в памяти, по которому расположен новый
 // массив
    int * changed_array = new int[new_size];           

// array обозначает наш исходный массив. здесь мы просто копируем то что было в старом в новый (на 
// который указывает changed_array). Если размерность нового массива будет меньше, чем размерность
// исходного, то мы при копировании вылезем за предел нового То есть как вариант
// for(int i=0;i<size, i<new_size;i++) или сообщение о том, что новый массив меньше и не все данные скопированы, 
// или еще какая-либо "защита" от выхода за предел массива
    for(int i=0;i<size;i++)                           
      changed_array[i] = array[i];                     

// после того, как мы скопировали что нужно из старого массива (по адресу array), мы его удаляем
    delete [] array;                                   

// и возвращаем уже новый указатель, по которому находится новый массив
    return array = changed_array; }


Код
// здесь указателю на массив присваивается другой указатель, на новый массив заданной размерности
  array = ResizeArray(array,n,n+10);



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.