Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
36 / 15 / 2
Регистрация: 02.09.2013
Сообщений: 565
1

Нужно ли в маложорных проектах использовать выделение и освобождение памяти?

10.12.2013, 20:03. Показов 4487. Ответов 35
Метки нет (Все метки)

В С++/Qt я не давно.
Я понял, что могу выделить память по new и освободить по delete.
mydata *p = new mydata()
...
somework
p.
p=
...
some work
delete p;
Но я заметил что без new и delete приложение кушает всего 6 мегабайт. И работает исправно.
Значит без указателей, память освобождается при закрытии программы ?
Можно работать в таких случаях без указателей и new ,delete ?
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2013, 20:03
Ответы с готовыми решениями:

Нужно немного переделать программу: использовать функции и динамическое выделение памяти
Помогите переделать программу в соответствии с условиями: а) для хранения массивов используйте...

Выделение и освобождение памяти
Доброго времени суток. Пишу класс по ООП, и назрел один вопрос, связанный с моментом выделения и...

Выделение и освобождение памяти
работаю со структурой на Си struct Matrix{ float **a; int n; } Структура...

Освобождение и выделение памяти
Помогите разобраться с программой, где здесь выделение памяти (как я понял это new) и где...

35
1397 / 1254 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
10.12.2013, 20:46 2
Почитайте любую литературу по прикладному программированию и по C++.

Короткий ответ:
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
Значит без указателей, память освобождается при закрытии программы ?
Память освобождается системой после закрытия приложения, как мы создавали объекты в приложении - не важно. После его закрытия от него ничего не останется.

Цитата Сообщение от MolodoyCoder Посмотреть сообщение
приложение кушает всего 6 мегабайт.
Чем проверяли потребление? Если стандартным виндовым менеджером - то не забываем что есть такое понятие как кеширование. И память после очередного delete не сразу высвобождается. Хотя тут многое зависит от частоты создания объектов и их размера.

В С++ каждый объект созданный через new должен быть удален через delete. Иначе останется в озу на время работы проги.
В Qt так же, если не использовать классы-наследники QObject и иерархию объектов. Если же писать правильно на Qt, то delete можно почти не использовать. Но это тонкости уже. Они описаны в любой книжке.
2
36 / 15 / 2
Регистрация: 02.09.2013
Сообщений: 565
16.12.2013, 11:53  [ТС] 3
Цитата Сообщение от RazrFalcon Посмотреть сообщение
В С++ каждый объект созданный через new должен быть удален через delete
Это я понимаю.
Я никак не пойму, почему в малых проектах, с мизерным расходом памяти, в учебниках и справочниках, объекты, массивы и даже просто переменные программируют с ручным выделением и освобождением памяти ?
Неужели если я читаю фиксированный файл на 200 килобайт, мне нужно заниматься ручным управлением памяти ?
0
1397 / 1254 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
16.12.2013, 12:02 4
А при чем тут чтение файла? Мы сейчас про способ создания объектов говорим.
Если создаем в пределах видимости функции - то и проблем никаких не будет.
В книгах примеры же, не будут же вам в пример приводить прогу в 1к строк, ведь так.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.12.2013, 12:18 5
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
нужно заниматься ручным управлением памяти ?
А в C++ ничего другого нет
0
36 / 15 / 2
Регистрация: 02.09.2013
Сообщений: 565
16.12.2013, 12:18  [ТС] 6
Цитата Сообщение от RazrFalcon Посмотреть сообщение
А при чем тут чтение файла? Мы сейчас про способ создания объектов говорим.
Если создаем в пределах видимости функции - то и проблем никаких не будет.
В книгах примеры же, не будут же вам в пример приводить прогу в 1к строк, ведь так.
Я хотел сказать, что мой объект хранит данные. Обрабатывает. Загружает в себя около 200 килобайт. И работает
с этими 200 килобайтами. Ну таких объектов около 27. Еще кое какая мелочевка.
В общем не 500 мегабайт, не гиг, не 10 гигов...
Поэтому я никак не могу понять на что мне при таких мизерах new - delete если и без них все работает...
0
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.12.2013, 12:35 7
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
Значит без указателей, память освобождается при закрытии программы ?
Можно работать в таких случаях без указателей и new ,delete ?
Память бывает разная. Есть куча, она освобождается принудительно оператором delete и предназначена для того, чтоб в ней выделять память оператором new. Та же программа всегда имеет стек, освобождаемый при выходе из области видимости, то есть при закрытии всякого блока {}, в котором объявлены переменные (в том числе, объекты). И всегда есть ещё память для глобальных и статических переменных, освобождаемая при закрытии всей программы. Как именно ты раскидаешь по этой памяти переменные (в том числе, объекты) - дело твоё. Но динамические данные можно выделить только в куче, поэтому избегать указателей можно только в том случае, если на этапе разработки точно известно, сколько переменных каждого типа должно существовать в каждый момент времени. В этом же случае избегать их нужно. Если же количество переменных в какой либо момент не известно на этапе разработки, то такие переменные должны быть динамическими и сделать их без указателей нельзя. Но и тогда можно и нужно избегать применение явных указателей везде, кроме частей программы, непосредственно отвечающих за существование динамических контейнеров и их элементов.

Добавлено через 57 секунд
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Память освобождается системой после закрытия приложения, как мы создавали объекты в приложении - не важно. После его закрытия от него ничего не останется.
Не так. Память освобождается в том числе при закрытии приложения.

Добавлено через 1 минуту
Указатели можно и нужно инкапсулировать как можно глубже.

Добавлено через 1 минуту
А если есть возможность использовать стандартные контейнеры, то указатели должны войти в них.
1
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.12.2013, 12:38 8
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
с этими 200 килобайтами. Ну таких объектов около 27
https://www.cyberforum.ru/cgi-bin/latex.cgi?200 \cdot 27 = 5400 т.е. 5 метров памяти, что в сумме превышает ограничение по размеру стека в Windows
1
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.12.2013, 13:03 9
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
Ну таких объектов около 27. Еще кое какая мелочевка.
В общем не 500 мегабайт, не гиг, не 10 гигов...
Не имеет значения. Пусть даже 12 байт. Но как только появляются слова: "около", "примерно", "не больше" и тому подобные категории, то сразу же возникает потребность в динамическом выделении и освобождении памяти. Тера и даже петабайт можно деклалировать обычной автоматической переменной и писать в требованиях систему, которая это проглотит. Но это должен быть ровно один петабайт. Или ровно один квадрилион один байт. Или любое другое точно известное количество. А от 10-ти до 12-ти байт динамически. Не потому, что много, или мало, а потому, что ты заранее не знаешь, сколько именно.
1
36 / 15 / 2
Регистрация: 02.09.2013
Сообщений: 565
16.12.2013, 17:28  [ТС] 10
Спасибо. Многое проясняется.
Еще один вопросик по этой теме...
Я вот создал класс MyClass
там описал функцию-член (мне проще назвать метод)
MyClass::MyFunc...ну и т.д. Она читает данные из файла и добавляет в вектор (который у меня - поле моего класса)
В конструкторе класса стоит вызов этой функции.
Вот я создаю объекты от этого класса
MyClass ob1,ob2;
Программа работает нормально. Выхожу из программы. Все нормально.
Но я могу создать ob1 с выделением new.
MyClass *p = new MyClass();
а после когда мне не надо, удалить объект. delete p.

Вот мне в таком случае надо обязательно работать через new-delete ??
Получается что нужно. У меня файл , на данный момент весит 500 килобайт. А может весить 2 мегабайта...
Вот из-за этого надо работать динамически с памятью ? Иначе когда нибудь будет ошибка выделения памяти ? Ну или её неээфективное использвание ?

Получается я должен думать над структурой своих классов, жизни их объектов...В общем думать. А не в лоб решать задачи ?
0
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.12.2013, 17:39 11
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
там описал функцию-член (мне проще назвать метод)
По идее словосочетания "функция-член" и "процедура-член" имеют смысл в контексте делфы, а не плюсов: там два вида методов, на плюсах один.

Добавлено через 2 минуты
Так что я тоже не понимаю идею Страуструпа.
0
36 / 15 / 2
Регистрация: 02.09.2013
Сообщений: 565
16.12.2013, 18:54  [ТС] 12
Мне вообще проще называть либо "функция" Хоть в классе, хоть сама по себе...
либо "метод"
А переменные класса - поле. Даже если поле есть переменная другого класса, все равно поле...
Поля и методы, по моему это просто и понятно.
Вот только непонятно, зачем объявления пишут в отдельном файле. /h
А реализацию в другом файле. Дело в том, что скакать не очень удобно...Я понимаю, что это не просто так...
Но пока не почувствовал зачем.
А Страуструпа пока перестал читать. Обращаюсь к другим источникам. Вроде у Страуструпа все расжеванно. Но иногда утомляет читать эти водянистые размышления, и суть из них выуживать.
0
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
16.12.2013, 18:58 13
Нет понятия "переменная класса". Бывают члены класса и экземпляры класса.
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
17.12.2013, 10:02 14
Удалите. нажал по ошибке.
0
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
17.12.2013, 10:08 15
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
А реализацию в другом файле. Дело в том, что скакать не очень удобно...Я понимаю, что это не просто так...
Вот именно потому и выносят все декларации компактно в отдельный файл, чтоб не скакать и не думать о том, как именно фаршировать реализацию декларациями, чтоб все декларации оказались перед первыми обращениями.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.12.2013, 10:19 16
Цитата Сообщение от MolodoyCoder Посмотреть сообщение
Она читает данные из файла и добавляет в вектор
Вектор сам выделяет память из кучи, поэтому это не влияет на размер класса.
Цитата Сообщение от taras atavin Посмотреть сообщение
По идее словосочетания "функция-член" и "процедура-член" имеют смысл в контексте делфы
Это общепринятая терминология.
На msdn используют Member Functions.
0
4199 / 1791 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
17.12.2013, 10:23 17
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Это общепринятая терминология.
Объясни, зачем конкретизировать вид метода, если он по правилам языка вообще один? На делфе есть методы двух видов: функции-члены и процедуры-члены, на c++ только одного - функции члены. Так почему не пользоваться простым собирательным названием "метод", обозначающим и функцию-член, и процедуру-член?
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
17.12.2013, 10:35 18
Цитата Сообщение от taras atavin Посмотреть сообщение
Так почему не пользоваться простым собирательным названием "метод", обозначающим и функцию-член, и процедуру-член?
Ну да. И в Симуле и в Смоллтолк - были методы. Непонятно, зачем Страуструпу было переименовывать велосипед.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.12.2013, 10:56 19
taras atavin, называй как хочешь. Так сложилось, что атрибуты/методы и поле данных/функция-член синонимы, и каждый употребляет то, что ему нравиться.

Цитата Сообщение от gng Посмотреть сообщение
И в Симуле и в Смоллтолк - были методы.
А в Си были только структуры и функции. Не забывайте, что C++ изначально был Си с классами.
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
17.12.2013, 11:09 20
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Си были только структуры и функции
Согласен. member functions можно рассматривать не как новый термин, а как уточнение термина Функция.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2013, 11:09

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

Выделение и освобождение памяти в c++
Не давно наткнулся на такую замечательность : system("PAUSE");//1 раз int *p = new int; //...

Выделение/освобождение памяти
По заданию делаю библиотеку "Хеш-таблица бинарных данных BLOB с цепочками" на языке C. Написал....

Выделение и освобождение памяти
Здравствуйте, помогите пожалуйста разобраться. Скажите является ли следующий код правильным в...

Выделение-освобождение памяти
Добрый день. Написал заготовку под программу. Возник вопрос: правильно ли выделяю-освобождаю...

Выделение и освобождение памяти
Вот встретился с вопросом какой вариант является более правильным и почему. char *Buffer1 =...

Выделение и освобождение памяти
В моей программе есть следующий код: char* lexems; // массив указателей на символ ...


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

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

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