Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27

Динамические глобальные переменные

01.02.2016, 12:05. Показов 5010. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При изучении С++ возникла проблема - потребовалось изменить два объекта одной функцией. Конечно, можно создать новый объект, являющийся объединением первых двух, и работать с ним, но у меня возник вопрос: можно-ли создать глобальную, но при этом динамическую переменную/массив/объект чтобы по завершении работы с ним очистить от него память?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2016, 12:05
Ответы с готовыми решениями:

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Глобальные переменные
Здравствуйте . Разбираю пример с книги на использование глобальных переменных . Там был такой пример: #include "stdafx.h" ...

глобальные переменные
Пробовал объявить глобальные переменные следующим образом: в заголовочном файле head.h #ifndef DF_H #define DF_H //объявления...

21
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.02.2016, 12:24
Аракчи, трудно понять, без кода о чём Вы говорите, но попытаюсь догадаться. Я знаю два способа получить доступ к динамической памяти через глобальную переменную (указатель конечно).
1. Её непосредственное объявление в глобальной области.
2. Можно спрятать статическую переменную в функции и возвращать её. Но это не в динамической памяти, скажете Вы. Но если переменная - указатель то вы можете выделить память и инициализировать там и так как Вам угодно.
0
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
01.02.2016, 13:45  [ТС]
Ну код предоставить не могу, поскольку как раз пытаюсь понять, как его лучше написать. Ситуация следующая: пытаюсь освоить рациональное использование памяти(работа с динамическими переменными и массивами, а так-же своевременное освобождение памяти от них), для тренировки было выбрано написание простенькой походовой стратегии с хотситом. Каждому игроку соответствует объект содержащий необходимые сведения, кроме того, есть объект содержащий сведения об игровом поле. Проблема возникла, когда задумался, как организовать сохранение и загрузку игр. С сохранением проблем нет, его легко вынести в отдельную функцию и передавать в неё необходимые данные. Но как сделать загрузку отдельной функцией, не создавая монструозный объект содержащий вообще все, что только можно, я пока сообразить не могу(или есть способ функцией определить несколько переменных?). Можно использовать глобальные объекты избавившись от проблемы, но цель не написать игрушку, а отработать своевременную очистку памяти, а глобальные переменные висят в памяти от начала и до конца. Вот мне и стало интересно возможно-ли как-то создавать и удалять глобальные переменные, как обычные динамические переменные. Можно, конечно, просто не выносить загрузку в отдельную функцию, но мне, почему-то, это кажется не правильным.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.02.2016, 14:19
Цитата Сообщение от Аракчи Посмотреть сообщение
но цель не написать игрушку, а отработать своевременную очистку памяти,
Это винегрет. Формализуйте задачу до простого вопроса. Не имеет смысла писать игру для того, чтобы понять как получить доступ к переменным, в том или ином случае.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
01.02.2016, 14:30
Лучший ответ Сообщение было отмечено Аракчи как решение

Решение

Цитата Сообщение от Аракчи Посмотреть сообщение
возможно-ли как-то создавать и удалять глобальные переменные, как обычные динамические переменные
Имхо, никаких особых сложностей быть не должно.
C++
1
2
3
4
5
6
7
int *Pglob;
main() {
 ....
 Pglob = new int[n]; // или Pglob = (int *)malloc(n*sizeof(int));
 ...
 delete Pglob; // free(Pglob);
}
Обращаться к Pglob можно и из других исходников. В том числе выделять для него память и уничтожать.
Естественно, он может указывать и на объекты другой природы, структуры или классы.
Единственно за чем надо следить, как бы не использовать его до создания или после удаления. Но это всегда так. Просто в этом случае надо следить в нескольких местах, но это опять же, ваше дело.
2
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
01.02.2016, 14:32  [ТС]
Формализовать задачу до простого вопроса? Можно-ли вынести чтение НЕСКОЛЬКИХ объектов из файла в отдельную функцию, не создавая статических глобальных объектов, которые будут висеть в памяти до и после чтения, и не создавая новый объект, который будет включать всё содержимое читаемых объектов? Если это возможно прошу подсказать как.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
01.02.2016, 14:37
Короче, глобальная переменная кроме области видимости совершенно ничем не отличается от любой другой. Ну, еще временем жизни.

Добавлено через 3 минуты
Аракчи, Как-то трудно понять вашу проблему. А может быть это потому, что ее не существует?
Вот что. Кода не надо. Просто набросайте (в коде, все-таки) что вы собираетесь делать.
1
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
01.02.2016, 14:43  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
как бы не использовать его до создания или после удаления
Понял, что не уверен как работает delete. Если после удаления снова попытаться присвоить значение переменной(например при повторной попытке загрузить сохранение), компилятор пошлёт меня лесом или нет?
P.S. Извиняюсь, что спрашиваю, просто возможности скомпилировать сейчас и проверить нет(
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
01.02.2016, 14:47
C++
1
2
3
4
5
6
7
8
9
10
int *Pglob;
main() {
 ....
 Pglob = new int[n]; // или Pglob = (int *)malloc(n*sizeof(int));
 x = Pglob[0];  // Нормально
 delete Pglob; // 
 x = Pglob[0];  // Нельзя!!!
 Pglob = new int[k]; // Ради Бога!
 x = Pglob[0];  // Нормально
}
Если, опять же, я правильно понял, что вас мучает
2
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.02.2016, 14:52
Цитата Сообщение от Аракчи Посмотреть сообщение
С сохранением проблем нет, его легко вынести в отдельную функцию и передавать в неё необходимые данные.
А при загрузке, разумеется, данные передать никак не получится.
Передавайте по ссылке все что нужно в функции записи/сохранения.
0
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
01.02.2016, 14:55  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Просто набросайте (в коде, все-таки) что вы собираетесь делать.
У меня до обращения на форум в голове было 3 разных решения ни одно из которых меня не устраивало:
1) Оставить чтение игровых объектов из файла сохранения в той-же функции, где они используются. Но мне кажется, что подобные действия следует выносить для большего удобства работы с кодом.
2) Использовать глобальные объекты для игровых параметров и производить чтение из файла непосредственно в них. Что предполагает, что они будут висеть в памяти от запуска приложения и до выхода из него.
3) Создать класс объектов содержащих все игровые параметры и производить чтение в объект этого класса. Но, на мой взгляд объект получился бы излишне громоздким.
Было ещё подозрение, что можно извернуться и использовать динамические глобальные объекты. Вот и решил спросить можно-ли и, если можно, то как?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.02.2016, 15:00
Цитата Сообщение от Аракчи Посмотреть сообщение
3) Создать класс объектов содержащих все игровые параметры и производить чтение в объект этого класса. Но, на мой взгляд объект получился бы излишне громоздким.
Почему громоздким.

Пусть у вас есть class Player; class GameField;

тогда:
C++
1
2
3
4
5
6
7
8
class Game
{
     std::vector<Player> players;
     GameField field;
public:
      void saveGame();
      void LoadGame();
};
Все.
1
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
01.02.2016, 15:04  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Если, опять же, я правильно понял, что вас мучает
Именно это меня и мучало. Спасибо огромное!
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.02.2016, 19:22
Цитата Сообщение от Аракчи Посмотреть сообщение
Формализовать задачу до простого вопроса? Можно-ли вынести чтение НЕСКОЛЬКИХ объектов из файла в отдельную функцию, не создавая статических глобальных объектов, которые будут висеть в памяти до и после чтения, и не создавая новый объект, который будет включать всё содержимое читаемых объектов? Если это возможно прошу подсказать как.
И всё же это не органичная смесь. Если Вам нужна пара объектов, - создайте класс который хранит эту пару. Скорее всего эта пара чем-то выделяется от остальных и там ещё найдутся и методы которые нужны только им и ни кому больше. А если костылить то можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A &dvoeIsLarca(int which)
{
static A first;
static A second;
if(which==1)return first;
return second;
}
 
 
//где-то
A firstFromFile;
A secondFromFile;
//читаете, инициализируете
dvoeIsLarca(1)=firstFromFile;
dvoeIsLarca(2)=secondFromFile;
 
//доступ
string nameFirst = dvoeIsLarca(1).name;
Не бог весть что, но пространство имён не затронуто.
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
02.02.2016, 01:19
Байт, рискну поправить Вас:
C++
1
2
3
4
 Pglob = new int[n];
 x = Pglob[0]; 
 delete Pglob; // ВОТ ТАК НЕЛЬЗЯ! Здесь нужен delete [], иначе бяка получается
 x = Pglob[0];
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.02.2016, 01:37
IGPIGP, Имхо, у ТС просто боязнь неизвестного. И я бы месяц назад просто бы над ним посмеялся.
Но сейчас я попытался влезть в дебри сайтострительства. Имею перед собой 6 различных сущностей, 6 языков.
HTML, PHP, CSS, JavaScript, MySql, CGI. Они местами похожи, местами - нет. И я всего боюсь! Хожу как по минному полю. При каждой удаче (именно удаче, метода делать правильные программки я так и не нащупал) я кричу - Ура! При неудаче - ухожу в короткий запой. Потом снова бьюсь головой в эту разнокирпичную стену - итерации продолжаются. Если я сейчас выложу список своих непонималок, у людей знающих будут колики.
Поэтому я стал с большим пониманием относиться к людям, не понимающих азов. Они хоть и Азы, но чтобы их понять, надо репу потереть (втереть). И иногда даже шальной, но дружеский, совет может пойти на пользу.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.02.2016, 01:39
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не бог весть что, но пространство имён не затронуто.
Или так:
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
class A
{
public:
    string name;
};
 
struct GV
{
    A first;
    A second;
};
 
GV& getGV()
{
    static GV objGV;
    return objGV;
}
 
    //где-то
    A firstFromFile;
    A secondFromFile;
    
    //читаете, инициализируете
    getGV().first = firstFromFile;
    getGV().second = secondFromFile;
 
    //доступ
    string nameFirst = getGV().first.name;
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.02.2016, 01:41
Цитата Сообщение от Croessmah Посмотреть сообщение
Байт, рискну поправить Вас:
Благодарю! Дело в том, что плюсовые парадигмы лежат от меня в стороне. И я тут очень даже могу ошибиться.
0
02.02.2016, 01:43

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
И я тут очень даже могу ошибиться.
Главное, помидорами не кидайтесь... в меня :D

0
02.02.2016, 01:50

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
помидорами не кидайтесь... в меня
Если вы мне покажете хоть один гнилой помидор, кинутый в вас, я готов его съесть!:D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2016, 01:50
Помогаю со студенческими работами здесь

Глобальные переменные
Объясните пожалуйста как правильно заводить глобальную переменную: static int k; или int k; в чем разница?

Глобальные переменные
Я правильно понимаю: &quot;в c++ использовать глобальные переменные не безопасно, т. к. др. программы могут случайно поменять значение этих...

Глобальные переменные
Здравствуйте, только начал изучать глобальные переменные/разбитие на функции и решил по экспериментировать над старым проектом, однако все...

Глобальные переменные
Здравствуйте! Возникла видимо классическая проблема, но перечитав кучу сайтов так ее и не решил. Пишу в VS2005, имеются 2 срр файла...

Глобальные переменные
Как в C++ завести глобальную (общую для функции и самой программы) переменную?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru