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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.79
ntny
7 / 7 / 0
Регистрация: 17.06.2012
Сообщений: 168
#1

указатели и очистка памяти - C++

23.11.2012, 20:41. Просмотров 6818. Ответов 23
Метки нет (Все метки)

В отличии от java в с++ память по умолчанию нужно очищать самостоятельно.

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

Правильно ли я поступлю, если создам новый новый указатель р0, сделаю присвоения р0 = р1; затем delete* р0;
и далее p1 = p2 ?

К слову читал, что в С++ есть сборщики мусора.
Насколько они используются ?
Это экзотика или же стандартная фича?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2012, 20:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос указатели и очистка памяти (C++):

Указатели и очистка памяти - C++
Возник интересный вопрос... class Test { int a; }; class Test1 : public Test { int b, c; }; int main() { Test1 *t = new Test1; ...

Очистка памяти - C++
Подскажите пожалуйста что не так делаю, создаю массив лейблов: TLabel **Labels; Labels = new TLabel*; for(int i = 0; i < rabot +...

Очистка памяти - C++
Как правильно очистить память в массиве классов Вот код конструктора, выделяющего память, и деструктора. Выдает ошибку в самом конце...

Очистка памяти - C++
Вот сделал лабу и все работает отлично, но осталось последнее new выделяет память мне нужно добавить функцию которая будет вызыватся в...

Очистка памяти - C++
Цель: Написать программу, которая читает текст из файла и записывает в новый файл те слова, которые содержат буквы, введенные с...

очистка памяти - C++
в данном случае деструктор очистит всё, или нет? #include "base.h" #include <cstdlib> #include <ctime> base::base(int x,int y) { ...

23
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 13:10 #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Но если класс является полностью самостоятельным, мы хотим просто использовать его для реализации функциональности приложения/библиотеки, но наружу давать ему доступ ни к чему, тут подойдёт пакетный уровень доступа.
Здесь пойдёт отдельная голова для себя и отдельная для всех. В одной голове описываешь те классы, которые должны быть доступны в приладе, а в другой те, которые должны быть доступны только в библиотеке.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
taras atavin, а вы признаёте только наследование?
С чего ты взял? Наследование помянул ТС, читай:
Цитата Сообщение от ntny Посмотреть сообщение
Для некоторых операций хочу написать подкласс.
Но было бы нежелательно, чтобы этот подкласс можно было вызвать из "клиентского" кода.
. Нужны комментарии?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.11.2012, 13:12 #17
taras atavin, да, может, это и выход. Но всё же доступ только в пределах пространства имён мне видится более привлекательным и удобным.

Добавлено через 1 минуту
taras atavin, если вы объявите один класс внутри другого как защищённый, то доступ к нему будут иметь только наследники. ТС, как я понял, имеет ввиду, что класс этот можно использовать где угодно в пределах пакета.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 13:15 #18
В пространство имён можно залезть где угодно, это не фактор безопасности, а только страховка от случайного совпадения имён.

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
taras atavin, если вы объявите один класс внутри другого как защищённый, то доступ к нему будут иметь только наследники. ТС, как я понял, имеет ввиду, что класс этот можно использовать где угодно в пределах пакета.
У джаванутых приняты специальные классы, оборачиваемые даже вокруг функции, являющейся точкой входа в программу. Так почему бы не перенять этот обычай и не завести специальный оболочечный класс только для управления доступом к другим классам?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.11.2012, 13:19 #19
taras atavin, почему обсуждение каких-ибо подобных функций всегда скатывается в безопасность? privat тоже не фактор безопасности, всё это лишь надстройки языка. Про безопасность в случае с пакетным доступом вряд ли идёт речь, речь идёт об удобном предоставлении/непредоставлении доступа разработчику/пользователю соответственно.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
У джаванутых приняты специальные классы, оборачиваемые даже вокруг функции, являющейся точкой входа в программу.
Это не у "джаванутых" принято, а в любом полностью ОО-языке. А в вашем примере получается "прощай, проектирование архитектуры!"
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 14:23 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Это не у "джаванутых" принято, а в любом полностью ОО-языке. А в вашем примере получается "прощай, проектирование архитектуры!"
Это джава то ОО? Хоть на грош? С удалением объекта после единственной операции с ним. Вот плюсы действительно полностью ОО, но не навязывают искусственных классов. Вся программа целиком экземпляром известного ей самой класса по ООП быть вообще не может, так как для неё это будет единственный класс такой абстракции, а она сама - единственный его экземпляр. Она ведь не видит ничего вокруг и не знает, что есть ещё какие то внешние сущности. Вот для пользователя действительно есть класс "приложение". Но этот класс включает в себя одновременно экзел и нидфоспид. А отдельно для экзела класса быть не может и с точки зрения пользователя. Этот класс - искусственная конструкция, примерно как карта, на которой было бы обозначено положение нашей вселенной. Относительно чего его обозначать? Такая суперкарта не нужна и не несёт информации, а вселенную с равным успехом можно обозначить хоть в центре её, хоть возле угла. Или попробуй описать класс "моё сознание". Не сможешь, так как не можешь посмотреть на собственное сознание со стороны.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.11.2012, 14:27 #21
taras atavin, вы скатываетесь в какую-то никому не нужную философию. К этому приводит любое обсуждение с вашим участием. В прошлый раз у вас невозможно было реализовать сборщик мусора в принципе, теперь у вас джава не объектно-ориентированная ни на грош. Возможно, мы с вами живём в различных Вселенных. Как бы то ни было, философию это будем заканчивать. К теме она никакого отношения не имеет.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.11.2012, 14:30 #22
Выделение части проекта в оболочечный спецкласс - совсем другое дело. Ни какой архитектуре оно не мешает.

Добавлено через 44 секунды
Цитата Сообщение от silent_1991 Посмотреть сообщение
taras atavin, вы скатываетесь в какую-то никому не нужную философию. К этому приводит любое обсуждение с вашим участием. В прошлый раз у вас невозможно было реализовать сборщик мусора в принципе, теперь у вас джава не объектно-ориентированная ни на грош. Возможно, мы с вами живём в различных Вселенных. Как бы то ни было, философию это будем заканчивать. К теме она никакого отношения не имеет.
А нефиг меня на философию провоцировать.
Кроме того, без философии прощай объектно-ориентированное проектирование архитектуры, потому что закономерность и истинная случайность сходства классов - это сплошная философия.

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
В прошлый раз у вас невозможно было реализовать сборщик мусора в принципе,
Эйси, автоматический вызов деструкторов не возможен в принципе. Как же тогда вообще юзать кучу?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.11.2012, 14:33 #23
Цитата Сообщение от taras atavin Посмотреть сообщение
Эйси, автоматический вызов деструкторов не возможен в принципе. Как же тогда вообще юзать кучу?
Это уже обсуждалось. Если вы до сих пор думаете, что сборка мусора не возможна - что ж, это ваши личные проблемы. Удачи.
 Комментарий модератора 
Повторяю, оффтоп закончили. Следующие сообщения буду удалять. Если уж очень хочется пообщаться на эти темы - пишите мне в СЛ.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7416 / 4531 / 670
Регистрация: 29.11.2010
Сообщений: 12,273
30.11.2012, 05:48 #24
C++ поддерживает идиому RAII.
Особенно явно она используется в STL, с умными указателями.
Также, в потоках ввода/вывода с файлов, деструктор сам закроет нужный файл (С++11), и вызывать метод close() уже нет необходимости.
0
30.11.2012, 05:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2012, 05:48
Привет! Вот еще темы с ответами:

Очистка памяти - C++
При выполнении программы, память приложения растёт, а она должна быть неизменной. int main() { setlocale(LC_ALL, "Russian"); ...

Vector, очистка памяти - C++
У меня есть вектор, который состоит из объектов типа класс. После выполнения данного блока мои объекты удаляются(вызываются ихние...

Ссылки и очистка памяти - C++
Здравствуйте! Если я создаю ссылку и присваиваю ей значение (константу или нет) должен я как и с указателями заботится об памяти? ...

Очистка памяти - ошибка - C++
Здравствуйте, друзья. Подскажите, пожалуйста, где ошибка: #include <stdio.h> int main() { int size = 5; int **array = new...


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

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

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