Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
1

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

01.02.2010, 01:44. Показов 1996. Ответов 20
Метки нет (Все метки)

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?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2010, 01:44
Ответы с готовыми решениями:

Неправильное выделение памяти в массиве
Прошу помощи в исправлении ошибки памяти. Ошибка: Вызвано исключение: нарушение доступа для...

Выделение памяти с помощью new под объекты без вызова их конструкторов
здравствуйте, корректен ли следующий код: myClass* pttr = static_cast<myClass*>(::operator new(5 *...

Как использовать динамическое выделение памяти для новых массивов фиксированного размера?
как использовать динамическое выделение памяти для новых массивов фиксированного размера?

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде...

20
Эксперт С++
1665 / 1037 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.02.2010, 19:02 2
Цитата Сообщение от insideone Посмотреть сообщение
Это корректный код для выделения памяти, чтобы к переменной можно было обращаться не по ссылке?
Ну корректным я его назвать не спешил бы, но цели добьёшься. Ну и потом, это как раз и есть обращение по ссылке (ты, вероятно, под "ссылкой" имел в виду указатель).
Цитата Сообщение от insideone Посмотреть сообщение
Это удалит выделенную память?
Да, удалит. Но обращаться по этой ссылке к удалённой памяти будет синтаксически допустимо и дальше, что не есть хорошо.
Цитата Сообщение от insideone Посмотреть сообщение
То можно ли в деструкторе класса написать так
Если это единственный случай создания такого объекта, то написать можно, потому что этот деструктор в итоге не будет вызван. Ну и объект вообще не удалится. А вообще, так писать нельзя.

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

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

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

Цитата Сообщение от zim22 Посмотреть сообщение
в деструкторе ты должен освободить ресурсы, которые были выделены в конструкторе.
***
и не только в конструкторе, но и вообще - для всего созданного объекта.
А вообще имеет смысл его писать (деструктор) если ресурсы нигде не выделялись?
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.02.2010, 19:41 5
Цитата Сообщение от insideone Посмотреть сообщение
А вообще имеет смысл его писать (деструктор) если ресурсы нигде не выделялись?
нет смысла
0
Эксперт С++
1665 / 1037 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.02.2010, 20:06 6
Смысл писать деструктор есть, если ты хочешь проделывать какие-то действия (неважно, какие - хотя бы сообщать о данном факте пользователю или подсчитывать баланс созданных и удалённых объектов) при уничтожении объекта. Если твой объект захватывает какие-то ресурсы, деструктор писать надо обязательно.
0
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
01.02.2010, 21:26  [ТС] 7
Впрочем это я к чему все.. у меня очень много глобальных переменных. Для работы с Direct3D, DirectInput, Объект игры, Объект сцены и т.д. они довольно крупные (очень) и мне почему то стало казаться что как то не правильно это все. Лучшим вариантом будет выделение этих объектов в коде через new там где надо или глобальные нормально? Ещё мне очень не нравится что эти все объекты используют другие объекты непосредственно, однако не знаю как их между собой переплести, т.к. они очень активно используют друг друга и для инициализации одного может понадобиться другой объект (например все строки грузятся в объект класса StringGroup, который должен уже быть наполнет в то время когда Объект сцен начнет подгружать объекты сцены которые могут содержать строки которые нужно будет включить из StringGroup). Я просто начинал писать код когда не знал C++ вообще. А теперь когда хоть что то стал соображать хочется знать как сделать лучше...
Обобщу: если есть куча объектов которые должны между собой общаться очень активно, то лучше внутрь каждого положить по члену-ссылке чтобы они могли общаться через ссылки?
0
Эксперт С++
1665 / 1037 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.02.2010, 18:50 8
Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
Что касается взаимосвязанности, то иногда лучше для развязки создавать мелкие объекты-значения. Например, сгруппировать в одном объекте-значении ссылку на StringGroup, ключ доступа (номер строки или что там) и нарисовать операторы преобразования типов по мере надобности (в const char* или что там надо). Ну и пользоваться им по семантике значения: передавать в функции, собирать в массивы-контейнеры и т.п. Так ты ещё и развязываешь себе руки на тот случай, если понадобится пользоваться несколькими объектами StringGroup. В общем, возможностей всяких полно.
1
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 19:52  [ТС] 9
Ещё один маленький вопрос... если мы выделили память через new и забыли delete то после закрытия приложения утечка остается в силе или закрытие приложения магическим образом все таки освобождает все что было затронуто приложением?
Полагаю что все же нет, но тогда можно было бы написать прослойку которая запоминает ссылки куда мы выделяли память и удаляет их из себя когда мы освобождаем их, а если не сделано - делает это сам допустим при завершения приложеня?

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

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

"Однажды тебе захочется выдернуть из чужой программы одну-две функции. Тогда то ты и поймешь разницу между глобальными и локальными объектами." (с) не мое
0
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 23:18  [ТС] 12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Переменных, а лучше - объектов, не являющихся глобальными. Лучше - автоматических или на автоматических умных указателях.
Можете привести какой нибудь пример... допустим есть 2 крупных объекта DX3D и DXDI где они должны быть созданы ... нужно учесть что они внутри своих методов используют друг друга. Так же есть и другие связи между другими объектами. Я что то тяжело соображаю саму логику такого постоения...
0
depict1
281 / 146 / 4
Регистрация: 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;
};
0
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 23:29  [ТС] 14
А объект Client уже глобальная переменная? А потом писать ObjClient.dx3d->... чтобы использовать внутри методов других классов?
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
02.02.2010, 23:49 15
Цитата Сообщение от insideone Посмотреть сообщение
А объект Client уже глобальная переменная?
ну и зачем ей быть глобальной?
0
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 23:56  [ТС] 16
А как тогда получать доступ внутри методов различных классов?
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
03.02.2010, 10:15 17
Цитата Сообщение от insideone Посмотреть сообщение
А как тогда получать доступ внутри методов различных классов?
найди опен-сорс проект где директХ применяют. и посмотри, как у них всё реализовано.
0
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
03.02.2010, 11:19 18
Цитата Сообщение от CheshireCat Посмотреть сообщение
"Глобальные переменные - всегда потенциальный источник проблем. От них лучше избавляться.
В пользу чего?) "
В пользу мозгов.
Программы можно строить по-разному.
Но мне за 15 лет еще не попадалось случая, когда бы глобальные переменные были НЕОБХОДИМЫМИ.
0
Автор FAQ
3683 / 960 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
03.02.2010, 13:09  [ТС] 19
найди опен-сорс проект где директХ применяют. и посмотри, как у них всё реализовано.
пожалуй так и сделаю, попотрошу HGE...
Но мне за 15 лет еще не попадалось случая, когда бы глобальные переменные были НЕОБХОДИМЫМИ.
Пол года опыта C++, "мозги" ещё не пришли. Я не вижу тут ничего очевидного чтобы можно было оскорблять(
0
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
03.02.2010, 13:15 20
Цитата Сообщение от insideone Посмотреть сообщение
Пол года опыта C++, "мозги" ещё не пришли. Я не вижу тут ничего очевидного чтобы можно было оскорблять(
Прошу прощения, я никого не хотел оскорбить.
Ситуация с переменными и стилями программирования становится понятной, после изучения основ бэйсика и паскаля.
Просто принципиально разные подходы.
Язык С - предполагает глобальные переменные, к которым можно обращаться отовсюду, а С++ - уже нет.
А обращение объектов друг к другу можно реализовать несколькими способами, например, передачей ссылок.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2010, 13:15

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Выделение памяти
Пишу программу в C++ Borland Builder 6. Если пытаюсь выделить сколь угодно много памяти с помощью...

Выделение динамической памяти
Задан граф в виде матрицы смежности вершин. Найти число компонент связности в этом графе....

Динамическое выделение памяти
В одном источнике прочитал следующее Т.е. блок выделяемой памяти должен быть кратен параграфу?...

Выделение большой памяти и крах C++)
Приветствую. Может кто встречался с данным недорозумением. Требуется выделить прилично памяти что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.