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

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

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

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

28.04.2009, 22:20. Просмотров 1577. Ответов 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).

Благодарю за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2009, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операции с динамической памятью (C++):

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

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

Работа с динамической памятью - 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 =...

20
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.04.2009, 22:44 #2
C++
1
for(int i=97; i<100; i++) delete a[i];
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.04.2009, 22:50 #3
ээээ... А a[i] будет не указатель, а элемент. Delete же с указателями работает. ИМХО, delete a[i] вызовет ошибку.
0
Monte-Cristo
2790 / 1376 / 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);
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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());
// вуаля!
1
Monte-Cristo
2790 / 1376 / 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;
}
0
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
28.04.2009, 23:39 #7
А кроме вектора, есть еще какая то возможность это сделать???
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.04.2009, 00:03 #8
вроде нет... нельзя удалить статический элмент... только через вектор или двойной указатель как я показал выше..
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
29.04.2009, 01:44 #9
у нас указатель на массив с определённой размерностью.поэтому,что не делай,память не освободится.А зачем тебе это нужно?Если нужно именно удалять элементы,освобождая память,то тогда нужен массив указателей,а не указатель на массив.А если просто уменьшить кол-во элементов,то конечно лучше вектор,как и было предложено.
0
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.04.2009, 08:04  [ТС] #10
Ну как зачем ?
Работа с динамической памятью - одна из функций ядра ОС, правильно ?
И в Виндовз, и в Линукс, есть возможность выделить, удалить, удалить ЧАСТИЧНО.
В C для этого есть realloc() (так, кажется).
Алгоритм, в котором это НЕОБХОДИМО: например, найти объединение двух множеств, заданных массивами своих элементов. Сначала создать массив длины a+b, затем копировать в него элементы, но может в конце остаться несколько ячеек не занятых - их надо удалить.
(списки, и вообще, STL - знаю, знаю...)
Неужели и правда, нельзя ?
Может, delete надо какой-то аргумент, не[] а например [97]. Главно что всё это - не документировано.
0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
29.04.2009, 09:03 #11
Ultrator, Упс, вот тут у вас ошибочка!
Функция realloc() УДАЛЯЕТ выделенный участок Хипа, и выделает новый под указанный размер. И, копирует данные, естественно.
Почитайте MSDN, там написано, что realloc() может вернуть вовсе не тот адрес, который ему передавали.
Можете сдалать то-же самое в своем примере.
1
Monte-Cristo
2790 / 1376 / 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.
0
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.04.2009, 11:46  [ТС] #13

Не по теме:

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


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

Добавлено через 1 минуту 57 секунд
Но также спасибо за такое разъяснение.
0
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);
0
29.04.2009, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2009, 13:43
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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