Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
#1

Операции с динамической памятью - C++

28.04.2009, 22:20. Просмотров 1532. Ответов 20
Метки нет (Все метки)

Есть new и delete.
Можно написать так:
C++
1
2
int *a;
a = new int [100];
Дальше, хотим удалить - пишем
C++
1
delete [] a;
Вопрос такой: а если надо удалить не весь отрезок a[0]..a[99], а только его "хвост", например a[97]...a[99] - тогда что нужно писать ?

(Интересует именно стандартный синтаксис C++, не C).

Благодарю за ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2009, 22:20     Операции с динамической памятью
Посмотрите здесь:

Работа с динамической памятью! - C++
Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю динамическую память. Определить время выделения и освобождения, и объем...

Ошибка с динамической памятью - C++
Очень прошу помочь исправить ошибку в области дин.памяти. Проблема: 1. Шаг Создаю массив для записи 2. Шаг удаляю элемент под...

Работа с динамической памятью - C++
Привет всем. Я недавно начал изучать C++ и наткнулся на ошибку:"двумерный динам.exe вызвал срабатывание точки останова" при очистке...

программа с динамической памятью - C++
текст программы #include <iostream> #include <conio.h> #include <stdlib.h> #include <iomanip> #define m 12 using namespace...

Работа с динамической памятью в цикле - C++
Всем привет. Есть переменная data, созданная динамически На каждой итерации цикла в нее записывается информация char* data =...

Объяснить код работы с динамической памятью - C++
Объясните пожалуйста этот кусок кода : class test { public: int *p = new int(); }; int main() { test *b =...

Написать класс контейнера с динамической памятью с++ - C++
Помогите, пожалуйста, вот с такой задачей. "Имеются N линейных списков, имеющих одинаковую структуру и упорядоченных по возрастанию...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.04.2009, 22:44     Операции с динамической памятью #2
C++
1
for(int i=97; i<100; i++) delete a[i];
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.04.2009, 22:50     Операции с динамической памятью #3
ээээ... А a[i] будет не указатель, а элемент. Delete же с указателями работает. ИМХО, delete a[i] вызовет ошибку.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.04.2009, 22:55     Операции с динамической памятью #4
Vourhey, точно) прогнал...

вот так вот тогда:
C++
1
for(int i=97; i<100; i++) delete (a+i);
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
28.04.2009, 23:18     Операции с динамической памятью #5
Ничего не надо писать. Прдложенный Monte-Cristo код всего лишь в лучшем случае приведет к UB, а вероятнее всего - к краху программы.

Если нужно удалять "хвост", используй вектор.
C++
1
2
3
4
vector<int> a(100);
//... тут с ним работаешь
a.erase(a.begin() + 97, a.end());
// вуаля!
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.04.2009, 23:29     Операции с динамической памятью #6
действительно... как-то я затупил..

Ultrator, удаление было бы возможно, если бы вы использовали вот такой вот случай:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
int main()
{
    int **a;
    int n = 10;
    a = new int*[n];
 
 
    for (int i=0; i<n; i++)
    {
        a[i] = new int;
        *a[i] = i;
    }
 
    for (int i=0; i<n; i++)
        cout << *a[i] << " ";
 
    for (int i=8; i<10; i++)
        delete a[i];
 
    cout << endl;
    for (int i=0; i<8; i++)
        cout << *a[i] << " ";
 
    delete[] a;
    return 0;
}
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
28.04.2009, 23:39     Операции с динамической памятью #7
А кроме вектора, есть еще какая то возможность это сделать???
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.04.2009, 00:03     Операции с динамической памятью #8
вроде нет... нельзя удалить статический элмент... только через вектор или двойной указатель как я показал выше..
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
29.04.2009, 01:44     Операции с динамической памятью #9
у нас указатель на массив с определённой размерностью.поэтому,что не делай,память не освободится.А зачем тебе это нужно?Если нужно именно удалять элементы,освобождая память,то тогда нужен массив указателей,а не указатель на массив.А если просто уменьшить кол-во элементов,то конечно лучше вектор,как и было предложено.
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.04.2009, 08:04  [ТС]     Операции с динамической памятью #10
Ну как зачем ?
Работа с динамической памятью - одна из функций ядра ОС, правильно ?
И в Виндовз, и в Линукс, есть возможность выделить, удалить, удалить ЧАСТИЧНО.
В C для этого есть realloc() (так, кажется).
Алгоритм, в котором это НЕОБХОДИМО: например, найти объединение двух множеств, заданных массивами своих элементов. Сначала создать массив длины a+b, затем копировать в него элементы, но может в конце остаться несколько ячеек не занятых - их надо удалить.
(списки, и вообще, STL - знаю, знаю...)
Неужели и правда, нельзя ?
Может, delete надо какой-то аргумент, не[] а например [97]. Главно что всё это - не документировано.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
29.04.2009, 09:03     Операции с динамической памятью #11
Ultrator, Упс, вот тут у вас ошибочка!
Функция realloc() УДАЛЯЕТ выделенный участок Хипа, и выделает новый под указанный размер. И, копирует данные, естественно.
Почитайте MSDN, там написано, что realloc() может вернуть вовсе не тот адрес, который ему передавали.
Можете сдалать то-же самое в своем примере.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.04.2009, 10:00     Операции с динамической памятью #12
Ultrator, вы можете удалять только созданные вами динамическии типа данных..

например кодом
C++
1
int *a = new int[5];
вы всего лишь динамически создаете одномерные массив.. удалять элементы в массиве, как вы знаете, нельзя.

для того чтобы было возможно удаление, необходимо создавать массив указателей:

C++
1
2
int **a = new int*[5];
for (int i=0; i<5; i++) a[i] = new int;
в таком случае, удалять элементы будет можно, в связи с тем, что масив содержит указатели на созданные динамически целые числа типа int.
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.04.2009, 11:46  [ТС]     Операции с динамической памятью #13

Не по теме:

Упс, вот тут у вас ошибочка!


Всё, дошло.Спасибо большое.
Спасибо всем.
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
29.04.2009, 13:29     Операции с динамической памятью #14
Да жаль, если действительно больше нету других возможностей...

Добавлено через 1 минуту 57 секунд
Но также спасибо за такое разъяснение.
YurA_280784
Заблокирован
29.04.2009, 13:43     Операции с динамической памятью #15
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
вроде нет... нельзя удалить статический элмент... только через вектор или двойной указатель как я показал выше..
А что если так
C++
1
2
3
4
5
int *a = new int[100];
//там как-то проинициализировали
char * chBuf = (char *)a;
chBuf[96] = '\0';
a = (int *)chBuf;
или

C++
1
a = (int *)realloc((void *)a, malloc(100*sizeof(int) - 4);
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
29.04.2009, 14:17     Операции с динамической памятью #16
1
2



int **a = new int*[5];
for (int i=0; i<5; i++) a[i] = new int;


в таком случае, удалять элементы будет можно, в связи с тем, что масив содержит указатели на созданные динамически целые числа типа int.


Я попробовал так сделать, но реально все равно не удалось удалить!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int **a=new int *[10];
    int i;
    for (i = 0; i < 10; i++) {
        a[i]=new int;
        *a[i]=i;
        cout << "a[" << i << "]=" << *a[i] << endl;
    }
 
    for (i = 5; i < 10; i++) {
        delete (a+i);
        cout << "a[" << i << "]=" << *a[i] << endl;
    }
    for (i = 0; i < 10; i++) {
        cout << "a[" << i << "]=" << *a[i] << endl;
    }
Или может я что то не так делаю??
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
29.04.2009, 14:32     Операции с динамической памятью #17
Разумеется, не так делаешь. После выполнения delete(a+i) любое обращение к a[i] уже невалидно и приводит к UB. Впечатление о том, что "не удалось удалить" - всего лишь частный случай такого UB, а могло быть и намного хуже.....
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
29.04.2009, 14:33     Операции с динамической памятью #18
Alexandr_LN, Конечно не так.
Никто не запрещает тебе обращаться к блоку памяти,даже после ее освобождения для дальнейшего использования.
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
29.04.2009, 14:45     Операции с динамической памятью #19
Дело в том что, после выполнения delete(a+i), я снова выполняю действие for (i = 0; i < 10; i++) {
cout << "a[" << i << "]=" << *a[i] << endl;
и результат тот же как и при первом цикле...
Ничего абсолютно не изменилось, ни ошибок при компиляции, и данные те же остались...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2009, 14:51     Операции с динамической памятью
Еще ссылки по теме:

Функции для работы с динамической памятью - C++
только начал изучать С++ сразу столкнулся с кучей вопросов. задача такая : разработать функции Create,Resize и Remove для создания,...

Работа с динамической памятью через указатели. - C++
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Есть такая задача: Создать массив из N целых чисел, N вводит...

Средства для контроля работы с динамической памятью - C++
Здравствуйте, товарищи! При написании программы на С++ встала проблема контроля выделения/удаления динамической памяти (необходимо для...

Управление динамической памятью при работе с классами - C++
Всем привет! Есть очень сложный класс, внутри которого есть куча указателей, в его конструкторе все эти указатели получают память при...

строки: работа с динамической памятью, перегруженные конструкторы - C++
Привет! Есть задача: Разработать класс String, который в дальнейшем будет использоваться для работы со строками. Класс должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
29.04.2009, 14:51     Операции с динамической памятью #20
Ну так при выполнении delete(a+i) ты не удалил данные по этому адресу,а показал системе,что данный блок свободен и может использоваться для дальнейшего выделения памяти. При этом там все еще могут лежать твои данные.
Yandex
Объявления
29.04.2009, 14:51     Операции с динамической памятью
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru