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

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
26.06.2011, 22:40     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #1
Собсно


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Это типа служебного класса. (Внимание! В оригинальном коде он вложен в класс xx, но я этого не стал делать, дабы не усложнять код!)
class nemo_ {
};
 
//А это вот класс для конечного пользователя
class xx {
 public:
  nemo_& funktsia () {
  nemo_* ne= new nemo_ [1];
  return *ne;
 };
};
 
int main () {
 xx m;
 
 //Так, вот щас создастся объект класса nemo_; а нужен он для того, чтобы выполнился определённый код, который в нём скрывается
 m.funktsia ();
 //Тут пойдёт всякий разный код, и мне объект nemo_ больше не нужен
}
Вот как удалить объект класса nemo? Указателя не него в main нет, создать указатель в main НЕ ПРЕДЛАГАТЬ ибо это что же получается, конечный пользователь будет пользоваться классом xx и потом ещё должен будет заботиться об удалении nemo_, о котором он знать ничего не знает? Это не наш метод, наш метод даже не знаю какой, по-моему придётся смириться с утечкой памяти, пусть после m.funktsia (); объект типа nemo_ существует до конца проги. Так что ли?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2011, 22:40     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!
Посмотрите здесь:

C++ Не создаётся объект класса
У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
Не создаётся объект string на ровном месте! Почему? C++
C++ Беда с оператором DELETE
C++ Прочитать никнейм из файла и после использования - удалить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.06.2011, 22:47     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #2
а сделать указатель мембером класса и удалять в деструкторе, не?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 22:54     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #3
По сути этот код эквивалентен напрмер такому:
C++
1
2
const char *s = "string";
strdup(s);
Если ничего не менять, то по-моему утечка неизбежна.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
26.06.2011, 22:54  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #4
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.06.2011, 22:58     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #5
Из строк 19—21 так и не понятно, нужен ли указатель на nemo_ в вызывающей функции хоть для чего-то?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 23:03     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #6
Раз функция только создает обьет nemo_, а пользователь об нем ничего не знает, то получается код который должен выполнится может находится только в конструкторе nemo_
Может стоит например просто перенести код из конструктора nemo_ в тело функии funktsia?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.06.2011, 23:06     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #7
Вот мне и непонятно, зачем возвращается ссылка на этот объект, если пользователю он не нужен и пользователь о нём и знать не знает. Тогда его надо удалить там же, где он и создался, то есть прямо в funktsia() и ничего не возвращать. В общем, теряюсь в догадках...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
26.06.2011, 23:14  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #8
А зачем вам знать? Не стоит ставить под сомнение целесообразность сего кода; да он бесполезен, но не более чем ЛЮБОЕ УПРАЖНЕНЕИЕ он всего лишь как гипотетический пример; на его основе разрабатывается полезный код.

//+++++++++++++++++++++++++++++++++++++++
Вообще я разработал перегрузку оператора [][] и вместо m.funktsia ();

у меня

matrix_ [5];

Так,
matrix_ [5] это перегрузка оператора [], то есть так:

nemo& matrix [] (int k) {
//Тут код, возвращающий адрес объекта ДРУГОГО класса
}

matrix_ [5] Это эквивалент m.funktsia ();

Ну и так далее. То есть возвращается указатель на объект класса nemo_
сюда
matrix_ [5]
и СРАЗУ ЖЕ следует перегрузка другого оператора [];

(Вот и кажется что он не используется; используется, но неявно.). ОН в выделенным жирным текстом

matrix_ [5][6]
которая определена в классе nemo_;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

В общем, вникать без надобности не стоит. Кстати, всё работает. Единственный
вопрос остался, как этот класс nemo_ удалить.

Добавлено через 3 минуты
Вот так то есть у меня:
int k= matrix_[5][6];

Жирным выделен адрес объекта класса nemo_
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.06.2011, 23:22     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #9
Цитата Сообщение от kravam Посмотреть сообщение
А зачем вам знать?
На вопрос "Как сделать что-нибудь" есть только один правильный ответ: "Как-нибудь".

Цитата Сообщение от kravam Посмотреть сообщение
Вот так то есть у меня:
int k= matrix_[5][6];
Жирным выделен адрес объекта класса nemo_
Ну, то есть речь о прокси-объектах. Что-нибудь мешает возвращать автоматически созданный объект по значению вместо динамического выделения памяти с возвратом по ссылке?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
26.06.2011, 23:37  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #10
Ничего не мешает. Но я просто хочу научиться тому, о чём спросил в первом посте только и всего.

///////////////////////////////////////////////////////////////////////////////////

Вся эта херь затеяна с целью научиться экономить память.

Если я поступлю как вы мне говорите, то да, исчезнет необходимость удалять где-то созданный объект. Вместо этого объект с помощью конструктора копирования будет возвращён в вызываемую функцию и будет там болтаться извините, как бельмо на глазу. Хотя он и невидим будет

Если я оставлю всё как есть- да и чёрт с ним со всем. Точно так же в недрах памяти будет создан маленький объект (он, кстати, представляет из себя адрес строки в матрице), который занимает немного места и который сам собой удалится по завершении программы.

То есть что последую я вашему совету, что оставлю всё как есть с точки зрения сложности кода и расхода памяти- всё едино. А вот научиться заявленному не научусь. А нужно щас учиться на простеньком коде.
Поймите же это наконец.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.06.2011, 23:41     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #11
Цитата Сообщение от kravam Посмотреть сообщение
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
ок, сделайте метод free который осободит память, а вызовет или не вызовет его клиент - его проблемы
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.06.2011, 23:47     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #12
Цитата Сообщение от kravam Посмотреть сообщение
Ничего не мешает. Но я просто хочу научиться тому, о чём спросил в первом посте только и всего.
В исходном посте спрашивалось, как удалить объект, если на него нет указателя и указатель никак не получить. Ответ простой. Никак. Не надо такого допускать, вот и всё.

Цитата Сообщение от kravam Посмотреть сообщение
Вся эта херь затеяна с целью научиться экономить память.
Экономить память осознанно создавая утечки? Это новый метод

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

Добавлено через 5 минут
Цитата Сообщение от kravam Посмотреть сообщение
То есть что последую я вашему совету, что оставлю всё как есть с точки зрения сложности кода и расхода памяти- всё едино. А вот научиться заявленному не научусь. А нужно щас учиться на простеньком коде.
Поймите же это наконец.
Я на простом примере и пытаюсь рассказать о том, что не нужно бояться возвращать объект по значению.
Вот очень простой пример с вопросом: сколько раз здесь вызовется конструктор по умолчанию и сколько конструктор копирования (ну и деструктор тоже)?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
using namespace std;
 
class A
{
public:
    A()           { cout << "I'm default ctor\n"; }
    A(A const& a) { cout << "I'm copy ctor\n"; }
    ~A()          { cout << "I'm destructor\n"; }
    void func()   { cout << "I'm func\n"; }
};
 
A test_func()
{
    A a;
    return a;
}
 
int main()
{
    cout << "test 1\n";
    test_func().func();
    cout << "test 2\n";
    A a(test_func());
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
26.06.2011, 23:53  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #13
test 1
I'm default ctor
I'm copy ctor
I'm destructor
I'm func
I'm destructor
test 2
I'm default ctor
I'm copy ctor
I'm destructor
I'm copy ctor
I'm destructor
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.06.2011, 23:55     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #14
Вот такого поведения никто не обещал. Оно возможно, но не обязательно.
Это VC, я так понимаю? А теперь попробуйте включить оптимизацию.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
27.06.2011, 00:15  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #15
Не пойдёт. Вот смотрим эту тему начиная с сообщения N 7
Почему не вызывается конструктор копирования?

Так, там по-моему в сообщении N 18 и 20 я чётко расписал почему мне нужен КК и почему он ВООБЩЕ нужен.

И там я сам нашёл решение в конце темы, чтобы КК всегда вызывался, а именно опция
-fno-elide-constructors

компилятора g++

Так что пусть уж вызывается. Короче я всё понял, ситуация безвыходная, ладно оставлю всё как есть, я оценил твою помощь, но создавать объекты в месте, куда они должны возвратиться, не буду.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 00:20     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #16
Цитата Сообщение от kravam Посмотреть сообщение
Так, там по-моему в сообщении N 18 и 20 я чётко расписал почему мне нужен КК и почему он ВООБЩЕ нужен.
Ситуации описанные и там и здесь называются просто: ошибки проектирования. Если тебя это устраивает, что ж, дело твоё. Правда тогда непонятно к чему эти вопросы
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
27.06.2011, 00:26  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #17
Да и бессмысленно включать оптимизацию и не вызывать тем самым конструктор копирования.

Ничё не выигрываю. Так он создастся с помощью new чёрт знает где, а этак- в вызывающей функции в стеке, который как бы ей принадлежит (без использования КК- твой вариант)

Но объект всё равно будет, вот в чём фишка.
А надо чтобы по использованию удалить. А никак. Вызвать деструктор- да, выполнится код, определённый в дестукторе. А объект создан в стеке, который принадлежит вызывающей функции, эта память системе не вернётся.

Так что невызов КК ничё не даст. Ты извини уж. Надо удалить именно созданый с помощью new, но нэто ни в какую, я уже понял

Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ситуации описанные и там и здесь называются просто: ошибки проектирования.
прерогативу разбираться в названиях вещей я оставляю тем, кто не разбирается в самих вещах.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 00:29     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #18
Цитата Сообщение от kravam Посмотреть сообщение
Да и бессмысленно включать оптимизацию и не вызывать тем самым конструктор копирования.
Оптимизацию включают не только для этого, но глупо делать копии, когда этого можно избежать.
Цитата Сообщение от kravam Посмотреть сообщение
Но объект всё равно будет, вот в чём фишка.
А надо чтобы по использованию удалить. А никак. Вызвать деструктор- да, выполнится код, определённый в дестукторе. А объект создан в стеке, который принадлежит вызывающей функции, эта память системе не вернётся.
Сама функция его из стека и удалит сразу же после вызова деструктора. Тоже мне проблема.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
прерогативу разбираться в названиях вещей я оставляю тем, кто не разбирается в самих вещах.
А как ещё назвать код, в котором осознано допускается утечка памяти и работоспособность которого зависит от опций компиляции?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
27.06.2011, 00:52  [ТС]     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #19
какого деструктора? я же тебе говорю, конечный пользователь ничего не знает о классе nemo_, ёлки-палки и следовательно не должно быть в коде вызова
C++
1
~nemo_();
Добавлено через 18 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Сама функция его из стека и удалит сразу же после вызова деструктора. Тоже мне проблема.
В дизассемблер не лазил, одно знаю, есть последовательность:
Удаление объекта-> вызов деструктора
Но не наоборот.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 00:59     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!
Еще ссылки по теме:

C++ Что будет с указателем после использования операции delete?
C++ Как подключить головной и ресурсный файлы к основной программе
C++ Зачем использовать delete в небольшой программе, если после закрытия память все равно освободится?

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 00:59     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! #20
Цитата Сообщение от kravam Посмотреть сообщение
какого деструктора? я же тебе говорю, конечный пользователь ничего не знает о классе nemo_, ёлки-палки и следовательно не должно быть в коде вызова
Для автоматический объект явно деструктор вызывать и так нельзя. Он вызовется сам. Вызовется потому, что объект (тот-самый прокси объект, который участвует только на промежуточном этапе) вышел из области видимости.

Цитата Сообщение от kravam Посмотреть сообщение
В дизассемблер не лазил, одно знаю, есть последовательность:
Удаление объекта-> вызов деструктора
Но не наоборот.
если речь не о вызове delete, то последовательность действий целиком на усмотрении компилятора.

Добавлено через 3 минуты
Я имею в виду именно освобождение памяти, о котором и зашла речь. Меня эта последовательность даже не интересует и я мог бы написать не после, а вместе с вызовом деструктора.
Yandex
Объявления
27.06.2011, 00:59     в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!
Ответ Создать тему
Опции темы

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