Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
 Аватар для SunFox25
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27

Высвобождение памяти статического массива

15.03.2019, 17:35. Показов 7932. Ответов 13

Студворк — интернет-сервис помощи студентам
Возник такой вопрос - память из под статических массивов высвобождается автоматически? То-есть допустим у нас есть следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
struct ExampleStruct
{
    int ExampleStaticArray[8];
}
 
ExampleStruct* ExampleDynamicArray;
 
//И где-то в коде программы:
 
ExampleDynamicArray = new ExampleStruct[16];
delete [] ExampleDynamicArray;
Таким образом, у нас структура, имеющая в себе статический массив, выделяется в памяти в динамическом массиве, а затем этот динамический массив удаляется. По идее здесь должны быть проблемы с памятью статического массива, а может быть и нет, не знаю, но у меня сейчас проблемы в проекте, и мне кажется что они могут быть связаны именно с этим.

Если есть здесь знатоки, оканчивающие ВУЗ по соответствующей специальности, прошу ответить.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2019, 17:35
Ответы с готовыми решениями:

Высвобождение памяти для 3 измерения массива
Здравствуйте. Не могу понять почему выходит ошибка. Я сделал 3х мерный массив, у которого 2 строки . Он неравномерный. В 1 строке 3...

Долгое высвобождение памяти
Здравствуйте. Возможно, такой вопрос уже встречался, но ответа мне найти не удалось. Намахал template List. ~List(){ Item *srh =...

Высвобождение динамической памяти
Нужна помощь, в проблеме высвобождения памяти, все делаю по стандартам С++, но постоянно выдает ошибки. Фото 1, в случае, если пытаюсь...

13
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 17:41
Цитата Сообщение от SunFox25 Посмотреть сообщение
Возник такой вопрос - память из под статических массивов высвобождается автоматически?
да, ты абсолютно прав, статически выделенную память не нужно освобождать, даже если она находится в памяти выделенной динамически.
0
126 / 64 / 17
Регистрация: 05.02.2013
Сообщений: 272
15.03.2019, 17:53
Цитата Сообщение от SunFox25 Посмотреть сообщение
ExampleStaticArray[8];
А где здесь статический массив? Или вы судите по имени ExampleStaticArray ?

При инициализации выделяется память под 16 экземпляров структуры, каждый экземпляр имеет размер 8*sizeof(int).
То есть выделяется всего 16*8*sizeof(int).
Если бы ваша структура была, скажем,

C
1
2
3
4
5
struct ExampleStruct
{
    int ExampleStaticArray[8];
    double ExampleStaticDouble;
}
то размер выделенной памяти был бы 16*(8*sizeof(int) + sizeof(double)) но все равно это динамическая структура.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 17:59
Цитата Сообщение от SmithSaires Посмотреть сообщение
А где здесь статический массив?
вот тут ты выделяешь память статически, во время компиляции. int ExampleStaticArray[8];
нет понятия статический массив, есть память выделенная статически, то есть автоматическая переменная, выделенная на стеке во время компиляции программы, динамически то есть выделенная динамически в куче во время выполнения программы, есть память статическая, выделяется автоматически и один раз, во время старта программы, не совсем точно, в ораторском искусстве я не силен
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
15.03.2019, 18:09
Цитата Сообщение от SunFox25 Посмотреть сообщение
Если есть здесь знатоки, оканчивающие ВУЗ по соответствующей специальности, прошу ответить.
такие вот знатоки после ВУЗа))

Цитата Сообщение от _stanislav Посмотреть сообщение
да, ты абсолютно прав, статически выделенную память не нужно освобождать, даже если она находится в памяти выделенной динамически.
Миниатюры
Высвобождение памяти статического массива  
3
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 18:10
eva2326, давай, свое фирменное "а теперь правильный ответ"
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
15.03.2019, 18:29
Цитата Сообщение от _stanislav Посмотреть сообщение
давай, свое фирменное "а теперь правильный ответ"
Понятие "статический" определят класс хранения объекта,
и никак не коррелирует с понятием "обычного сишного массива"

Классы хранения бывают: статический, автоматический, динамический, thread_local.

Цитата Сообщение от SunFox25 Посмотреть сообщение
у нас структура, имеющая в себе статический массив, выделяется в памяти в динамическом массиве, а затем этот динамический массив удаляется. По идее здесь должны быть проблемы с памятью статического массива,
По какой такой идее?

О какой такой статической памяти вы вообще думаете, когда у вас объект в динамической памяти располагается?
Целиком, Карл!
0
126 / 64 / 17
Регистрация: 05.02.2013
Сообщений: 272
15.03.2019, 18:30
Цитата Сообщение от _stanislav Посмотреть сообщение
вот тут ты выделяешь память статически, во время компиляции. int ExampleStaticArray[8];
Если так, как ты написал, то есть просто

int ExampleStaticArray[8]

то правильно, не если

C++
1
2
3
4
struct ExampleStruct
{
    int ExampleStaticArray[8];
}
это не выделение памяти - это описание структуры (в будущем выделенной) памяти.
0
 Аватар для SunFox25
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
15.03.2019, 19:05  [ТС]
Я в ВУЗе не учился, поэтому не разбираюсь в терминалогии, и не знаю что такое статическая память, или например статический массив. Я просто не знал как задать вопрос, и по поиску в интернете увидел слово - "статический массив". Я решил, что так "обычный сишный массив" и называется.

У меня был конкретный вопрос: вот эта структура

C++
1
2
3
4
struct ExampleA
{
    int a[8];
}
будет при образовании динамического массива вести себя точно так же как и

C++
1
2
3
4
struct ExampleB
{
    int b;
}
или будут проблемы с "обычным сишным массивом"? Можно ли вообще создавать динамические массивы содержащие в себе структуры с обычными массивами, или лучше сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct ExampleC
{
    int* c;
}
 
ExampleC* C;
C = new ExampleC[16];
for (int i = 0; i < 16; i++)
{
    C[i].c = new int[8];
}
for (int i = 0; i < 16; i++)
{
    delete [] C[i].c;
}
delete [] C;
Вообще ещё можно использовать std::vector, но у меня были с ними проблемы, описанные в этой теме: ИИ для шахматно-подобной игры - std::bad_alloc
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 19:10
Цитата Сообщение от SunFox25 Посмотреть сообщение
Можно ли вообще создавать динамические массивы содержащие в себе структуры с обычными массивами
если размер известен во время компиляции то не можно а нужно.
0
126 / 64 / 17
Регистрация: 05.02.2013
Сообщений: 272
15.03.2019, 19:58
Цитата Сообщение от SunFox25 Посмотреть сообщение
содержащие в себе структуры с обычными массивами,
Вот смотри. Это так называемые файлы заголовков - надеюсь знакомо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __stdlib_h__
#define RAND_MAX 0x7FFF
typedef struct {
  int quot; /* quotient */
  int rem; /* remainder */
} div_t;
 
typedef struct {
  long quot; /* quotient */
  long rem; /* remainder */
} ldiv_t;
typedef struct {
    long long quot;
    long long rem;
} lldiv_t;
или

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
struct __file {
    char    *buf;       /* buffer pointer */
    unsigned char unget;    /* ungetc() buffer */
    uint8_t flags;      /* flags, see below */
#define __SRD   0x0001      /* OK to read */
#define __SWR   0x0002      /* OK to write */
#define __SSTR  0x0004      /* this is an sprintf/snprintf string */
#define __SPGM  0x0008      /* fmt string is in progmem */
#define __SERR  0x0010      /* found error */
#define __SEOF  0x0020      /* found EOF */
#define __SUNGET 0x040      /* ungetc() happened */
#define __SMALLOC 0x80      /* handle is malloc()ed */
#if 0
/* possible future extensions, will require uint16_t flags */
#define __SRW   0x0100      /* open for reading & writing */
#define __SLBF  0x0200      /* line buffered */
#define __SNBF  0x0400      /* unbuffered */
#define __SMBF  0x0800      /* buf is from malloc */
#endif
    int size;       /* size of buffer */
    int len;        /* characters read or written so far */
    int (*put)(char, struct __file *);  /* function to write one char to device */
    int (*get)(struct __file *);    /* function to read one char from device */
    void    *udata;     /* User defined and accessible data. */
};
Как известно заголовочные файлы подключаются к коду и с помощью препроцессора разворачиваются для компилляции.
Это я только малую часть показал, а вообще подобного там огого - посмотри ради интереса

Так вот вопрос на засыпку -- выделяется ли память во время компиляции для вышеуказаного кода и почему.

Правильный ответ - нет!!! не выделяется. Потому, что это просто описание структуры - своего рода пользовательский тип данных. А вот когда ты объявишь переменную данного типа - тогда другой вопрос. Если объявишь как статическую - будет статическая - освободить нельзя, если динамически - нужно освобождать память.
0
 Аватар для SunFox25
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
15.03.2019, 21:40  [ТС]
_stanislav, то-есть если я сделаю вот так:

C++
1
delete [] ExampleDynamicArray;
Ошибок не будет? И багов тоже?

SmithSaires, а где во всех этих структурах массивы? Искал их несколько минут, но всё равно не нашёл, то ли я слепой, то ли вы чего-то не поняли.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.03.2019, 21:43
Лучший ответ Сообщение было отмечено SunFox25 как решение

Решение

Цитата Сообщение от SunFox25 Посмотреть сообщение
Ошибок не будет? И багов тоже?
не будет
1
126 / 64 / 17
Регистрация: 05.02.2013
Сообщений: 272
16.03.2019, 10:41
Цитата Сообщение от SunFox25 Посмотреть сообщение
Искал их несколько минут, но всё равно не нашёл
Плохо искал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* File attribute constants for _findfirst() */
 
#define _A_NORMAL       0x00    /* Normal file - No read/write restrictions */
#define _A_RDONLY       0x01    /* Read only file */
#define _A_HIDDEN       0x02    /* Hidden file */
#define _A_SYSTEM       0x04    /* System file */
#define _A_SUBDIR       0x10    /* Subdirectory */
#define _A_ARCH         0x20    /* Archive file */
 
struct _wfinddata32i64_t {
        unsigned    attrib;
        __time32_t  time_create;    /* -1 for FAT file systems */
        __time32_t  time_access;    /* -1 for FAT file systems */
        __time32_t  time_write;
        __int64     size;
        wchar_t     name[260];
};
C++
1
wchar_t     name[260];
это массив
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2019, 10:41
Помогаю со студенческими работами здесь

Корректное высвобождение памяти в list
У меня все нормально работает, ну и по логике тоже вроде нормально, но намучился с Коректным высвобождением памяти(ну пару раз упала...

Инициализация статического массива
Добрый вечер! Допустим, что имеется класс class A { .... public: static int array; .... }; Как инициализировать массив в...

Обнуление статического массива
Нужна помощь с обнулением массива,который записан в файл и выведен на экран Надо его обнулить и снова записать в файл и на экран вывести ...

Инициализация статического массива
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами статиеский массив указателей. Пишет слудеющее (прикрепил скриншот)....

Из статического массива в динамический
Здравствуйте . Помогите , пожалуйста , переделать эту программу(сортировку) , чтобы она работала с динамическим массивом . #include...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru