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

Поиск:

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


Эксперт
***


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

Репутация: нет
Всего: 23



Решил поэкспериментировать с динамической памятью. В общем память, выделенная с помощью malloc() - должна освобождаться функцией free(). А new - с помощью delete <объект/тип> или delete []<объект/тип>. Хочу изменить в методе Add() класса MyArray размер динамической памяти с помощью старой функции realloc() языка С - нормально.

Вопрос такой: а хорошо/плохо то, что в деструкторе не free(), а delete [] при том, что в одном из методов используется realloc?
Код


using namespace std;

class MyArray{

private:

int *array;
unsigned int n;

public:

        MyArray(void);

        ~MyArray(void);

void Add(int);

void Randomizer(unsigned int);

};
        MyArray::MyArray(void):n(0), array(0)
        {
        }

        MyArray::~MyArray(void)
        {
        delete []array;
        }

        void MyArray::Randomizer(unsigned int count)
        {
        array = new int [ count ];
        n = count;
        for(int i=0; i<n; ++i) array[i] = rand();
        }

        void MyArray::Add(int Element)
        {
                if(!n)
                {
                 n++;
                 array = new int [1];
                 array[n-1] = Element;
                }

                else
                {
                 array = (int*)realloc(array, (n+1)*sizeof(int));
                 array[n++] = Element;
                }
        }


Это сообщение отредактировал(а) Voldemar2004 - 13.11.2006, 15:35


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
EvgenZ
Дата 13.11.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Майерс точнобы заплакал  smile , если используешь new, надо использовать delete... вроде так.


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


Опытный
**


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

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



Канешь очень плохо. По стандарту: " Результат вызова delete для указателя, который не был получен из new, не определен".  smile 
PM MAIL ICQ   Вверх
Voldemar2004
Дата 14.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Так я и использую new и delete соответственно. Просто в методе Add() расширение памяти делается с помощью realloc().


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
JackYF
Дата 14.11.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Нет. По идее realloc использовать тоже нельзя. 
По причине, что указал AlexST. Лучше взять и перевыделить... Если громоздко - завернуть в отдельную функцию...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
AlexST
Дата 14.11.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Voldemar2004, calloc, malloc,  free, realloc реализованы на одном алгоритме. new/delete - это другое.

Цитата(Voldemar2004 @  14.11.2006,  14:11 Найти цитируемый пост)
Так я и использую new и delete соответственно. Просто в методе Add() расширение памяти делается с помощью realloc().
Сам себе противоречишь: всё-таки используешь realloc вместе с new.  smile 


Это сообщение отредактировал(а) AlexST - 14.11.2006, 19:02
PM MAIL ICQ   Вверх
Rockie
Дата 14.11.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Voldemar2004 @  13.11.2006,  15:24 Найти цитируемый пост)
Вопрос такой: а хорошо/плохо то, что в деструкторе не free(), а delete [] при том, что в одном из методов используется realloc?


Voldemar2004, полагаю плохо и вот почему: To new is C++; To malloc is C; To mix them is sin


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Voldemar2004
Дата 15.11.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Rockie, я тоже читал недавно эту страницу. smile 
Цитата(JackYF @  14.11.2006,  16:26 Найти цитируемый пост)
Лучше взять и перевыделить...
На форуме читал, по-моему через вектор?
Цитата(JackYF @  14.11.2006,  16:26 Найти цитируемый пост)
Если громоздко - завернуть в отдельную функцию...
Получается очень громоздко. Лучше уж тогда отдельная функция.


--------------------
i_i 
(';') 
(V)

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


Freedom in me
**


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

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



Зачем через вектор? Можно просто создать массив большей длинны чем нынешний, копируешь туда значения из маленького, удаляешь маленький массив и создаешь его заново увеличив размер, затем переносишь из вспомогательного массива данные в свой заново роженный и удаляешь вспомогательный. 


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


sceloglauxalbifacies
****


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

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



EvgenZ, эм. а вспомогательный то зачем вообще? smile
PM MAIL   Вверх
BUGOR
Дата 15.11.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну кстати на системном уровне пара  new/delete аналогична malloc/free, просто появилась чуть позже, уже в С++, а вот что она там по стандартам возвращает я не в курсе.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
EvgenZ
Дата 15.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



А как? Как создать массив большего размера из массива не используя вспомогательного с сохранением данных?



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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Заранее выделять хотя бы в 2 раза больше, чем надо... в особых критичных случаях...
Как это, например, делает большинство STL- контейнеров.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 15.11.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(JackYF @  15.11.2006,  16:25 Найти цитируемый пост)
Заранее выделять хотя бы в 2 раза больше, чем надо... в особых критичных случаях...
Как это, например, делает большинство STL- контейнеров. 

С самых распрастраненных реализациях STL коэффициент около 1.5
PM MAIL WWW   Вверх
JackYF
Дата 15.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Daevaorn, ну пускай будет 1.5... Суть остается неизменной...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
AlexST
Дата 15.11.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(BUGOR @  15.11.2006,  14:06 Найти цитируемый пост)
Ну кстати на системном уровне пара  new/delete аналогична malloc/free, просто появилась чуть позже, уже в С++
Malloc это допотопная функция, тупо выделяющая память, компилятор для которой даже не в состоянии проверить правильность возврата указателя (идёт void). New с ней по функциональности даже нечего сравнивать.  smile 

Я уже не говорю о том, что free не подчистит хорошо за new, а delete за malloc (и т. п.) напороть может.

Это сообщение отредактировал(а) AlexST - 15.11.2006, 19:37
PM MAIL ICQ   Вверх
Daevaorn
Дата 15.11.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(AlexST @  15.11.2006,  20:32 Найти цитируемый пост)
New с ней по функциональности даже нечего сравнивать

Во многих реализациях в new вызывется malloc.
PM MAIL WWW   Вверх
BUGOR
Дата 15.11.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Malloc это допотопная функция, тупо выделяющая память, компилятор для которой даже не в состоянии проверить правильность возврата указателя (идёт void). New с ней по функциональности даже нечего сравнивать.  


Я же сказал на системном уровне. И та, и другая пара использует HeapAlloc/HeapFree, а насчёт введения дополнительных проверок и того, что она возаращет я уже кажется сказал. 


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
AlexST
Дата 15.11.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Daevaorn @  15.11.2006,  20:06 Найти цитируемый пост)
Во многих реализациях в new вызывется malloc.
Канешь.  smile 

PM MAIL ICQ   Вверх
Rockie
Дата 15.11.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если честно, так и не понял зачем выделять лишний массив. Создать новый требуемой размерности, скопировать туда элементы из изначального, поменять местами указатели и убить старый массив.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Voldemar2004
Дата 15.11.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 23



Цитата(EvgenZ @  15.11.2006,  14:13 Найти цитируемый пост)
 копируешь туда значения из маленького, удаляешь маленький массив и создаешь его заново увеличив размер, затем переносишь из вспомогательного массива данные в свой заново роженный и удаляешь вспомогательный. 
М-да. Я так и не нашел нигде как обойти malloc и сделать все через new, у Страуструпа тоже нет.

Добавлено @ 23:06 
Цитата(Daevaorn @  15.11.2006,  21:06 Найти цитируемый пост)
Во многих реализациях в new вызывется malloc.
Попробовал свой вышеописанный код - все нормуль, вроде бы.



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
EvgenZ
Дата 16.11.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Код

#include <iostream>
int main(){
int SIZE =5, max = SIZE, i=0, ch;
int* Arr = new int[SIZE];
std::cout << "vvedi chislo";
std::cin >> ch;
while(ch != 0){
    Arr[i++] = ch;
    if(i == max){
        int* vsArr = new int [max + SIZE];
        for(int i = 0; i < max; ++i)
            vsArr[i] = Arr[i];
        delete [] Arr;
        Arr = new int[max+SIZE];
        for(int i = 0; i < max; ++i)
            Arr[i] = vsArr[i];
         max+=SIZE;
         delete [] vsArr;
    } 
std::cout << "vvedi chislo";
std::cin >> ch;
}
return 0;
}


кривовато, но смысл отображает, я это имел ввиду.

Добавлено @ 00:32 
Код

void* buf = operator new(10*sizeof(char));
//...
//...
operator delete(buf);

эквиваленты malloc & free


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


Эксперт
***


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

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



Цитата(Voldemar2004 @  15.11.2006,  23:02 Найти цитируемый пост)
 Я так и не нашел нигде как обойти malloc и сделать все через new, у Страуструпа тоже нет.

вот попробовал, покритикуйте пожалуйста. smile

Код
#include<iostream>

using namespace std;


void FillArray(int * array, int size)        // заполнение массива по порядку
 {
    for(int i=0;i<size;i++)
      array[i] = i;
 }

void DisplayArray(int * array, int size)     // распечатка массива  
 {
    cout<< endl;
    for(int i=0;i<size;i++)
      cout<< array[i] << ' ';
 }


int* ResizeArray(int * array, int size, int new_size)  // изменение размера массива
 {
    int * changed_array = new int[new_size];           // создание нового массива  

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

    delete [] array;                                   // уничтожение старого

    return array = changed_array;                      // возвращаемый пойнтер указывает на новый массив
 }


int main(){

  const int n = 5;

  int * array = new int[n];             // создание массива

  FillArray(array,n);                                           

  DisplayArray(array,n);               

  array = ResizeArray(array,n,n+10);    // изменение размера  

  DisplayArray(array,n+10);               

  delete [] array;                      // delete отработает уже по новому массиву

  cin.get();
  return 0;
}



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
EvgenZ
Дата 16.11.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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





Добавлено @ 10:21 
Цитата

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

а это как, если ты пишешь, что новый у тебя на 10 больше старого?

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


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 8.1.2006
Где: Томск

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



Интуиция подсказывает, что лучше не 1.5, а золотое сечение  smile . Доказать не могу  smile 
PM MAIL   Вверх
EvgenZ
Дата 16.11.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Что такое золотое сечение?


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



EvgenZ, приблизительно 1.61...

Добавлено @ 14:26 
Если точнее, то ( "корень из 5" -1 ) / 2


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dumb
Дата 16.11.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
Ты удалил array, но новый не создал! И возвращаешь вообще непонятно что. Тут идет передача того чего нет и утечка памяти.

перечитай еще два раза код функции ResizeArray. она для работы не годится, но суть верна.
PM MAIL   Вверх
Rockie
Дата 16.11.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
Уверен, сто работает не правильно. Ты удалил array, но новый не создал! И возвращаешь вообще непонятно что. Тут идет передача того чего нет и утечка памяти.

программу запускал?

Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
а это как, если ты пишешь, что новый у тебя на 10 больше старого?

на случай если вместо 
Код
 array = ResizeArray(array,n,n+10);    // изменение размера  
 задать 
Код
 array = ResizeArray(array,n,n-1);    // это пример  



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
EvgenZ
Дата 16.11.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Вот сейчас запустил...  извиняюсь  smile 
Код

    delete [] array;                             
    return changed_array;    

вот это мне не понятно, откуда новый берется? И собственно почему вообще работает   smile 

т.е. это получается, что создается временный changed_array который присваивается в main size'у и потом удаляется? Почему тогда size куда-то указывает? Почему не ругается на return size = сhanged_array;   ?

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


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
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.0844 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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