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

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

01.02.2016, 12:05. Показов 4935. Ответов 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
9005 / 4706 / 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
9005 / 4706 / 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
9005 / 4706 / 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
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