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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 16:54   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию изменение размерности массива

с++
всем доброго времени суток. прежде чем задать вопрос, сразу скажу- STL не затрагивать.
Ну и собственно вопрос:
как в процессе работы программы корректно изменить размерность динамического массива, чтобы не было утечки памяти?
Вот написал небольшую программу. В ней пользователь может менять размерность. Вроде ни каких глюков нет, но мне кажется там не совсем правильно.
Код:
#include <iostream>
#include <conio.h>

int i = 0;

using namespace std;


void get_array(int z, int array[])
{
    for (i = 0; i < z; i++)
    {
        cout<<"array "<<i<<"="<<array[i]<<endl<<endl;
    }
}

void set_array(int z, int array[])
{
    for (i = 0; i < z; i++)
    {
        array[i] = i;
    }

}


int main()
{
    int z;//    размер
    int* array;
    array = new int[z];

    cout<<"ENTR Z   ";
    cin>>z;

    set_array(z, array);

    get_array(z, array);

    //delete array;
    array = new int[z];
    cout<<"ENTR Z   ";
    cin>>z;

    set_array(z, array);
    get_array(20, array);

    _getch();

    delete array;
    return 0;
}
мне кажется это не совсем правильно. предположим в чале мы задали размерность массива 10
потом уменьшим размерность до пяти. что в этом случае станет с последними пятью ячейками? ведь я их delete не уничтожил.
если все-таки мой вариант не правильный- Подскажите как правильно менять размерность. еще раз повторюсь- без употребления STL.
Вложения
Тип файла: rar main.rar (181.0 Кб, 11 просмотров)

Последний раз редактировалось SAMOUCHKA; 11.10.2011 в 19:32.
SAMOUCHKA вне форума Ответить с цитированием
Старый 11.10.2011, 17:04   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

SAMOUCHKA

мы задали размерность массива 10
потом уменьшим размерность до пяти


ничего ты не "уменьшил". просто итерация будет осуществляться не до конца массива, вот и всё.

set_array(z, array);
get_array(20, array);


выход за границы массива, в случае если x < 20

как правильно менять размерность

- выделить новую память (new[])
- скопировать массив (memcpy)
- удалить старую память (delete[])
Rififi вне форума Ответить с цитированием
Старый 11.10.2011, 17:11   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

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

если при смене размера повторно не применить
array = new int z; то действительно не чего не меняется.

еще вопрос-
есть-ли способ для обнаружения утечки памяти?

Последний раз редактировалось Stilet; 12.10.2011 в 08:27.
SAMOUCHKA вне форума Ответить с цитированием
Старый 11.10.2011, 23:32   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

перед тем как делаешь повторный new int[], удали старый, а то память выделяешь два раза а освобождпешь один, и что еще печальней не тем delete (тут уже было).

Цитата:
есть-ли способ для обнаружения утечки памяти?
знаю про это, но это только если пользуешся VS и malloc/realloc.

Последний раз редактировалось f.hump; 11.10.2011 в 23:34.
f.hump вне форума Ответить с цитированием
Старый 12.10.2011, 12:56   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

SAMOUCHKA

есть-ли способ для обнаружения утечки памяти?

Конечно есть.
Хотя лучше всего использовать C++ и забыть о том, что такое утечки.
если же все же хочется онанизма на "Си с классами"...

способ попроще - гоогле Debug CRT Library
способ посложнее - гоогле AQtime Pro
Rififi вне форума Ответить с цитированием
Старый 12.10.2011, 15:19   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Riffi: Хотя лучше всего использовать C++ и забыть о том, что такое утечки.
Каким местом С++ помогает забыть об утечках памяти?
f.hump вне форума Ответить с цитированием
Старый 12.10.2011, 15:23   #7
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Наверное опечатка и там С# но и в шарпе есть утечки если не отписаться от события например
Guy вне форума Ответить с цитированием
Старый 13.10.2011, 02:36   #8
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Каким местом С++ помогает забыть об утечках памяти?
Например, std::vector вместо динамического массива.
An1ka вне форума Ответить с цитированием
Старый 13.10.2011, 09:12   #9
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
Например, std::vector вместо динамического массива.
ну так это вроде STL? я же в самом начале писал что его не надо использовать.
не знаю я это, пока еще. думаю что прежде чем учить STL надо в чисто
с++ как следует разобратся.
SAMOUCHKA вне форума Ответить с цитированием
Старый 13.10.2011, 10:47   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
как правильно менять размерность

- выделить новую память (new[])
- скопировать массив (memcpy)
- удалить старую память (delete[])
realloc()

Цитата:
Сообщение от An1ka Посмотреть сообщение
Например, std::vector вместо динамического массива.
И смарт поинтеры вместо обычных указателей.

Кто не хочет пользоваться STL и другими библиотеками, может написать свое
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение всего массива RedStorm Microsoft Office Excel 2 10.04.2011 12:54
C++ - изменение размера массива kefir Помощь студентам 1 19.06.2010 11:42
Задание размерности 2мерного массива Bernarditto Общие вопросы C/C++ 2 18.06.2010 17:04
Конструктор для изменения размерности массива and277 Общие вопросы C/C++ 2 10.08.2009 20:47
увеличение размерности массива Лучик_света Общие вопросы .NET 3 25.10.2008 04:36