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

Выделение памяти - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
01.02.2010, 01:44     Выделение памяти #1
C++
1
MyClass& DXI =* new MyClass();
Это корректный код для выделения памяти, чтобы к переменной можно было обращаться не по ссылке?
C++
1
delete &DXI;
Это удалит выделенную память?

Кроме того... если
C++
1
MyClass* pDXI;
А потом в теле программы где либо:
C++
1
pDXI = new MyClass();
То можно ли в деструкторе класса написать так
C++
1
2
3
MyClass::~MyClass(){
   delete this;
}
При выходе из программы память же должна освободиться?

Я так же запутался в этом: Если деструктор вызывается при delete &obj, то что будет если я в нем же напишу delete this?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
01.02.2010, 19:02     Выделение памяти #2
Цитата Сообщение от insideone Посмотреть сообщение
Это корректный код для выделения памяти, чтобы к переменной можно было обращаться не по ссылке?
Ну корректным я его назвать не спешил бы, но цели добьёшься. Ну и потом, это как раз и есть обращение по ссылке (ты, вероятно, под "ссылкой" имел в виду указатель).
Цитата Сообщение от insideone Посмотреть сообщение
Это удалит выделенную память?
Да, удалит. Но обращаться по этой ссылке к удалённой памяти будет синтаксически допустимо и дальше, что не есть хорошо.
Цитата Сообщение от insideone Посмотреть сообщение
То можно ли в деструкторе класса написать так
Если это единственный случай создания такого объекта, то написать можно, потому что этот деструктор в итоге не будет вызван. Ну и объект вообще не удалится. А вообще, так писать нельзя.

Вообще, вся эта самодеятельность не особо-то и нужна. Есть же умные указатели. Тот же auto_ptr и что там идёт ему на смену в новом стандарте...
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.02.2010, 19:09     Выделение памяти #3
Цитата Сообщение от insideone Посмотреть сообщение
То можно ли в деструкторе класса написать так
в деструкторе ты должен освободить ресурсы, которые были выделены в конструкторе.
***
и не только в конструкторе, но и вообще - для всего созданного объекта.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
01.02.2010, 19:20  [ТС]     Выделение памяти #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
Ну корректным я его назвать не спешил бы, но цели добьёшься. Ну и потом, это как раз и есть обращение по ссылке (ты, вероятно, под "ссылкой" имел в виду указатель).
Да, я и хотел по ссылке. Просто раньше я плохо различал понятия и путал где надо сказать указатель а где ссылка)) Теперь понимаю, однако могу описаться, почему то так....
А почему не корректно то? Имеются какие то потери?

delete this в деструкторе не работает, странно... ведь читал об этом. Он вызывает переполнение стека, т.к. delete this вызывает деструтрор... и в нем же находится. Рекурсия...

Да все таки наверное я зря так извращаюсь. Просто тяжело как то понять где в проекте нужно выделять основные объекты, т.к. нужно создать там где они впервые используются а это место может меняться ведь. Ну а удалять наверное стоит при завершении программы, написать все delete и все... так же это делается?

Цитата Сообщение от zim22 Посмотреть сообщение
в деструкторе ты должен освободить ресурсы, которые были выделены в конструкторе.
***
и не только в конструкторе, но и вообще - для всего созданного объекта.
А вообще имеет смысл его писать (деструктор) если ресурсы нигде не выделялись?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.02.2010, 19:41     Выделение памяти #5
Цитата Сообщение от insideone Посмотреть сообщение
А вообще имеет смысл его писать (деструктор) если ресурсы нигде не выделялись?
нет смысла
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
01.02.2010, 20:06     Выделение памяти #6
Смысл писать деструктор есть, если ты хочешь проделывать какие-то действия (неважно, какие - хотя бы сообщать о данном факте пользователю или подсчитывать баланс созданных и удалённых объектов) при уничтожении объекта. Если твой объект захватывает какие-то ресурсы, деструктор писать надо обязательно.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
01.02.2010, 21:26  [ТС]     Выделение памяти #7
Впрочем это я к чему все.. у меня очень много глобальных переменных. Для работы с Direct3D, DirectInput, Объект игры, Объект сцены и т.д. они довольно крупные (очень) и мне почему то стало казаться что как то не правильно это все. Лучшим вариантом будет выделение этих объектов в коде через new там где надо или глобальные нормально? Ещё мне очень не нравится что эти все объекты используют другие объекты непосредственно, однако не знаю как их между собой переплести, т.к. они очень активно используют друг друга и для инициализации одного может понадобиться другой объект (например все строки грузятся в объект класса StringGroup, который должен уже быть наполнет в то время когда Объект сцен начнет подгружать объекты сцены которые могут содержать строки которые нужно будет включить из StringGroup). Я просто начинал писать код когда не знал C++ вообще. А теперь когда хоть что то стал соображать хочется знать как сделать лучше...
Обобщу: если есть куча объектов которые должны между собой общаться очень активно, то лучше внутрь каждого положить по члену-ссылке чтобы они могли общаться через ссылки?
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
02.02.2010, 18:50     Выделение памяти #8
Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
Что касается взаимосвязанности, то иногда лучше для развязки создавать мелкие объекты-значения. Например, сгруппировать в одном объекте-значении ссылку на StringGroup, ключ доступа (номер строки или что там) и нарисовать операторы преобразования типов по мере надобности (в const char* или что там надо). Ну и пользоваться им по семантике значения: передавать в функции, собирать в массивы-контейнеры и т.п. Так ты ещё и развязываешь себе руки на тот случай, если понадобится пользоваться несколькими объектами StringGroup. В общем, возможностей всяких полно.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
02.02.2010, 19:52  [ТС]     Выделение памяти #9
Ещё один маленький вопрос... если мы выделили память через new и забыли delete то после закрытия приложения утечка остается в силе или закрытие приложения магическим образом все таки освобождает все что было затронуто приложением?
Полагаю что все же нет, но тогда можно было бы написать прослойку которая запоминает ссылки куда мы выделяли память и удаляет их из себя когда мы освобождаем их, а если не сделано - делает это сам допустим при завершения приложеня?

Добавлено через 1 минуту
Цитата Сообщение от Nick Alte Посмотреть сообщение
Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
В пользу чего?)
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
02.02.2010, 20:38     Выделение памяти #10
Цитата Сообщение от insideone Посмотреть сообщение
Ещё один маленький вопрос... если мы выделили память через new и забыли delete то после закрытия приложения утечка остается в силе или закрытие приложения магическим образом все таки освобождает все что было затронуто приложением?
Не магическим, но освобождает - за этим следит операционка. Впрочем, какие-то другие ресурсы могут оказаться заблокированными.

Цитата Сообщение от insideone Посмотреть сообщение
В пользу чего?
Переменных, а лучше - объектов, не являющихся глобальными. Лучше - автоматических или на автоматических умных указателях.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,315
02.02.2010, 22:32     Выделение памяти #11
"Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
В пользу чего?) "

"Однажды тебе захочется выдернуть из чужой программы одну-две функции. Тогда то ты и поймешь разницу между глобальными и локальными объектами." (с) не мое
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
02.02.2010, 23:18  [ТС]     Выделение памяти #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Переменных, а лучше - объектов, не являющихся глобальными. Лучше - автоматических или на автоматических умных указателях.
Можете привести какой нибудь пример... допустим есть 2 крупных объекта DX3D и DXDI где они должны быть созданы ... нужно учесть что они внутри своих методов используют друг друга. Так же есть и другие связи между другими объектами. Я что то тяжело соображаю саму логику такого постоения...
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
02.02.2010, 23:22     Выделение памяти #13
Цитата Сообщение от insideone Посмотреть сообщение
допустим есть 2 крупных объекта DX3D и DXDI где они должны быть созданы ...
C++
1
2
3
4
5
6
7
class DX3D { };
class DXDI { };
 
class Client {
  DX3D *dx3d;
  DXDI *dxdi;
};
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
02.02.2010, 23:29  [ТС]     Выделение памяти #14
А объект Client уже глобальная переменная? А потом писать ObjClient.dx3d->... чтобы использовать внутри методов других классов?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
02.02.2010, 23:49     Выделение памяти #15
Цитата Сообщение от insideone Посмотреть сообщение
А объект Client уже глобальная переменная?
ну и зачем ей быть глобальной?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
02.02.2010, 23:56  [ТС]     Выделение памяти #16
А как тогда получать доступ внутри методов различных классов?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
03.02.2010, 10:15     Выделение памяти #17
Цитата Сообщение от insideone Посмотреть сообщение
А как тогда получать доступ внутри методов различных классов?
найди опен-сорс проект где директХ применяют. и посмотри, как у них всё реализовано.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
03.02.2010, 11:19     Выделение памяти #18
Цитата Сообщение от CheshireCat Посмотреть сообщение
"Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
В пользу чего?) "
В пользу мозгов.
Программы можно строить по-разному.
Но мне за 15 лет еще не попадалось случая, когда бы глобальные переменные были НЕОБХОДИМЫМИ.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
03.02.2010, 13:09  [ТС]     Выделение памяти #19
найди опен-сорс проект где директХ применяют. и посмотри, как у них всё реализовано.
пожалуй так и сделаю, попотрошу HGE...
Но мне за 15 лет еще не попадалось случая, когда бы глобальные переменные были НЕОБХОДИМЫМИ.
Пол года опыта C++, "мозги" ещё не пришли. Я не вижу тут ничего очевидного чтобы можно было оскорблять(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2010, 13:15     Выделение памяти
Еще ссылки по теме:

Выделение памяти C++
Выделение памяти C++
C++ Выделение памяти
C++ выделение памяти
Выделение памяти C++

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

Или воспользуйтесь поиском по форуму:
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
03.02.2010, 13:15     Выделение памяти #20
Цитата Сообщение от insideone Посмотреть сообщение
Пол года опыта C++, "мозги" ещё не пришли. Я не вижу тут ничего очевидного чтобы можно было оскорблять(
Прошу прощения, я никого не хотел оскорбить.
Ситуация с переменными и стилями программирования становится понятной, после изучения основ бэйсика и паскаля.
Просто принципиально разные подходы.
Язык С - предполагает глобальные переменные, к которым можно обращаться отовсюду, а С++ - уже нет.
А обращение объектов друг к другу можно реализовать несколькими способами, например, передачей ссылок.
Yandex
Объявления
03.02.2010, 13:15     Выделение памяти
Ответ Создать тему
Опции темы

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