Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.04.2016
Сообщений: 2
1

Управление памятью

26.04.2016, 21:11. Просмотров 691. Ответов 5
Метки нет (Все метки)


Заранее прошу прощения за глупый вопрос (задаю его по причине новизны для меня C++)

У меня есть функция, которая делает какие-то вычисления или обработку данных и как результат должна возвращать объект. Т.к объект может быть достаточно большим, то по идее его нужно возвращать через указатель, скрывая внутри функции new SomeObject(%params%);

Но в таком случае кто должен быть ответcтвенен за вызов delete для данного объекта?

На сколько знаю: по негласным правилам - тот, кто создал объект - должен его же и уничтожить.

На сколько правильно, при создании какого-то законченого модуля, перекладывать удаление объекта на пользователя этого модуля? И на сколько правильно делать тоже самое внутри своего модуля (или это можно считать косяком архитектуры)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2016, 21:11
Ответы с готовыми решениями:

Управление памятью в C++
Здравствуйте! Сколько уже читаю про указатели, но никак не пойму кое-что: когда их использовать?...

Управление памятью
1. Требования к управлению памятью 1.1. перемещение 1.2. защита 1.3. совместное...

управление памятью
500 Кбайт физической памяти в системе. Размер блока памяти 2 кбайт. Выделить блок , стратегия...

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

5
Эксперт С++
1663 / 1035 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
26.04.2016, 21:24 2
Для таких случаев предусмотрена передача ответственности. Полная поддержка на уровне языка и библиотеки началась со стандарта C++11 (move-семантика, unique_ptr и всё такое).
Большой объект - это крайне подозрительно. Почему он оказался большой? Неужели в нём огромное количество данных, и все совершенно разнородные, но при этом являются неотчуждаемыми частями единого целого? Может, стоило уложить данные не в объект, а в подходящий контейнер, например vector? Тогда его спокойно можно возвращать из функции, вызывающая сторона примет ответственность за данные на себя.
Современный стиль подразумевает отсутствие в коде "сырых" указателей и операций new и delete.
0
С чаем беда...
Эксперт CЭксперт С++
8492 / 4215 / 1168
Регистрация: 18.10.2014
Сообщений: 9,122
26.04.2016, 22:18 3
Цитата Сообщение от FKFobos Посмотреть сообщение
На сколько знаю: по негласным правилам - тот, кто создал объект - должен его же и уничтожить.
Такое правило если и может существовать, то только с точностью до модуля/библиотеки: какой модуль создал объект, тот модуль должен его и уничтожить.

Не ничего страшного в том, что обязанность уничтожить объект возлагается на пользователя модуля. Однако лучше будет, скорее всего, не делать это через голый delete, а предоставить в том же модуле специальную функцию для уничтожения объекта. Пусть пользователь модуля не знает, создавался ли этот объект через new, через malloc или еще как-то по-другому.

А в наше время, когда объекты принято использовать через умные указатели, обязанность явно уничтожать объект с пользователя может быть снята. Модуль должен лишь создать умный указатель с правильно запрограммированной функцией уничтожения. А вызовется она уже сама.
0
Эксперт С++
8391 / 3932 / 858
Регистрация: 15.11.2014
Сообщений: 8,869
26.04.2016, 22:23 4
Цитата Сообщение от FKFobos Посмотреть сообщение
У меня есть функция, которая делает какие-то вычисления или обработку данных и как результат должна возвращать объект. Т.к объект может быть достаточно большим, то по идее его нужно возвращать через указатель, скрывая внутри функции new SomeObject(%params%);
возвращайте по значению.
либо возвращайте смартпоинтер.


Цитата Сообщение от FKFobos Посмотреть сообщение
На сколько правильно, при создании какого-то законченого модуля, перекладывать удаление объекта на пользователя этого модуля?
это безобразие.

Цитата Сообщение от FKFobos Посмотреть сообщение
И на сколько правильно делать тоже самое внутри своего модуля (или это можно считать косяком архитектуры)?
внутри своего модуля делайте что хотите.
пока это не станет головной болью клиентов - всем будет наплевать.
0
0 / 0 / 0
Регистрация: 26.04.2016
Сообщений: 2
26.04.2016, 22:28  [ТС] 5
Цитата Сообщение от Nick Alte Посмотреть сообщение
Может, стоило уложить данные не в объект, а в подходящий контейнер, например vector? Тогда его спокойно можно возвращать из функции, вызывающая сторона примет ответственность за данные на себя.
А это принято в рамках "негласных правил"? И получается клиент, использующий функцию должен будет по окончании использования вызвать delete для всех объектов в контейнере? Или в контейнер будут укладываться смартпоинтеры?
0
Эксперт С++
1663 / 1035 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
27.04.2016, 19:42 6
Цитата Сообщение от FKFobos Посмотреть сообщение
А это принято в рамках "негласных правил"?
Да. Встроенная в стандартные контейнеры move-семантика позволяет обойтись без копирования данных при их возвращении из функции. Естественное ограничение - межмодульные границы, например, возврат вектора из DLL, которая может быть создана другим компилятором.

Цитата Сообщение от FKFobos Посмотреть сообщение
И получается клиент, использующий функцию должен будет по окончании использования вызвать delete для всех объектов в контейнере?
Нет, вектор уничтожит их сам. Содержащиеся в нём объекты под его ответственностью.

Цитата Сообщение от FKFobos Посмотреть сообщение
Или в контейнер будут укладываться смартпоинтеры?
Это тоже возможно, но без этого уже свободно можно обойтись в большинстве случаев.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2016, 19:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Работа с allocator (управление памятью)
Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование...

Управление памятью с использованием malloc и free
int n=3; int * v = (int*) malloc(n*sizeof(int)); // обьявил вектор из 3-х целочисельных...

Программирование с использованием ссылок. Управление памятью в С++
Народ, помогите программу написать, пожалуйста. Условие : Написать программу с использованием...

Управление динамической памятью при работе с классами
Всем привет! Есть очень сложный класс, внутри которого есть куча указателей, в его конструкторе...


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

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

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