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

Удалить массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.81
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
13.03.2011, 16:27     Удалить массив #1
Нужно полностью удалить созданный в приложении массив:
C++
1
2
3
4
5
6
7
8
9
char n=100;
struct mag
{
 char a[255];
 std::map<std::string, int> list;
 char b[255];
 int c[255];
 std::vector<int> lists;
}mas[n];
Как это правильно сделать?
Как я понял просто вот так:
C++
1
delete mas;
он не удалится?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 16:27     Удалить массив
Посмотрите здесь:

Как удалить динамический массив? C++
C++ если массив не является знакочередующимся,то удалить из массива все положительные числа,в противном случае-удалить отрицательные элементы.после удален
C++ Массив: Удалить из строки цифры
Сформировать одномерный массив целых чисел, используя датчик случайных чисел, и распечатать массив. Удалить из массива все элементы, совпадающие с его C++
Сформировать массив строк. Удалить из него одинаковые строки. Сформировать массив строк. Удалить из него К последних строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.03.2011, 16:55     Удалить массив #2
По-хорошему, код работать не должен, поскольку n - не константа. Но если принять, что GCC такой код схавал, то удалить этот массив вы никак не сможете, потому что он создан в автоматической памяти и, следовательно, уничтожится только автоматически, по окончании работы программы. Удалять вы можете только объекты, которые сами и создали в куче при помощи оператора new.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
13.03.2011, 17:02  [ТС]     Удалить массив #3
Вот немного поправил:
C++
1
2
3
4
5
6
7
8
9
#define ELEM 100
struct mag
{
 char a[255];
 std::map<std::string, int> list;
 char b[255];
 int c[255];
 std::vector<int> lists;
}mas[ELEM];
Это статический массив структур, содержащих char, int, ассоциативный контейнер map и контейнер vector.
Как cоздать и потом удалить такой массив через new и delete?
Спасибо
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
13.03.2011, 17:06     Удалить массив #4
Вы говорите противоречащие вещи
Цитата Сообщение от Union Посмотреть сообщение
Это статический массив структур
и
Цитата Сообщение от Union Посмотреть сообщение
удалить такой массив через new и delete
Статический - значит создается не на куче( динамическая память , где можно самостоятельно освобождать и выделять память ), а в сегменте данных, где ни выделить во время выполнения программы, ни освободить память самостоятельно не представляется возможным, как было сказано ранее, память освободится только по завершении программы.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.03.2011, 17:06     Удалить массив #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct mag
{
    char a[255];
    std::map<std::string, int> list;
    char b[255];
    int c[255];
    std::vector<int> lists;
};
 
int main()
{
    mag *mas = new mag [100];
    // Работа с mas
    delete [] mas;
 
    return 0;
}
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
13.03.2011, 17:10  [ТС]     Удалить массив #6
Не, статический массив ничего кроме определенного неизменного его размера не значит. Т.е. при создании четко задано количество элементов и далее в процессе работы приложения оно не может меняться. Динамический массив - наоборот. В него могут добавляться и удаляться элементы. Как это происходит - уже другой вопрос, вопрос реализации.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
По-хорошему, код работать не должен, поскольку n - не константа...
Почему же? Я может не сразу его создаю, а сначала вычисляю нужный мне размер. n не обязана быть константой.

Всем спасибо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.03.2011, 17:13     Удалить массив #7
Union, обязана. Именно поэтому вообще существует такая вещь, как динамическое выделение памяти. Иначе работал бы такой код:
C++
1
2
3
int n;
std::cin >> n;
int arr[n];
Да, может, в GCC он работает, но суть от этого не меняется, arr всё равно выделяется в стеке, а стек не резиновый, и n ограничена размером стека, тогда как при выделении памяти в куче размер ограничен только доступным объёмом памяти.

Добавлено через 23 секунды
Короче говоря, стандарт таких финтов ушами не допускает.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
13.03.2011, 17:14  [ТС]     Удалить массив #8
Т.е. получается что данный массив создаётся до начала выполнения кода программы и размер соответственно должен быть определен также до начала выполнения?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2011, 17:16     Удалить массив
Еще ссылки по теме:

C++ удалить двумерный массив
Сформировать одномерный массив, удалить первый элемент с заданным значением, сдвинуть массив циклически C++
C++ Не удаётся удалить массив new, утечка памяти

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

Или воспользуйтесь поиском по форуму:
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
13.03.2011, 17:16     Удалить массив #9
По сути да, если массив был объявлен вне функции, то будет размещен в секции данных, если в функции без модификатора static, то ему будет выделено фиксированное место на стеке.
Yandex
Объявления
13.03.2011, 17:16     Удалить массив
Ответ Создать тему
Опции темы

Текущее время: 09:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru