быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

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

26.06.2011, 22:40. Показов 4675. Ответов 55
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собсно


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_ существует до конца проги. Так что ли?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2011, 22:40
Ответы с готовыми решениями:

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


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

Или воспользуйтесь поиском по форуму:
55
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.06.2011, 22:47 2
а сделать указатель мембером класса и удалять в деструкторе, не?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 22:54 3
По сути этот код эквивалентен напрмер такому:
C++
1
2
const char *s = "string";
strdup(s);
Если ничего не менять, то по-моему утечка неизбежна.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
26.06.2011, 22:54  [ТС] 4
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
26.06.2011, 22:58 5
Из строк 19—21 так и не понятно, нужен ли указатель на nemo_ в вызывающей функции хоть для чего-то?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 23:03 6
Раз функция только создает обьет nemo_, а пользователь об нем ничего не знает, то получается код который должен выполнится может находится только в конструкторе nemo_
Может стоит например просто перенести код из конструктора nemo_ в тело функии funktsia?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
26.06.2011, 23:06 7
Вот мне и непонятно, зачем возвращается ссылка на этот объект, если пользователю он не нужен и пользователь о нём и знать не знает. Тогда его надо удалить там же, где он и создался, то есть прямо в funktsia() и ничего не возвращать. В общем, теряюсь в догадках...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
26.06.2011, 23:14  [ТС] 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_
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
26.06.2011, 23:22 9
Цитата Сообщение от kravam Посмотреть сообщение
А зачем вам знать?
На вопрос "Как сделать что-нибудь" есть только один правильный ответ: "Как-нибудь".

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

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

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

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

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

То есть что последую я вашему совету, что оставлю всё как есть с точки зрения сложности кода и расхода памяти- всё едино. А вот научиться заявленному не научусь. А нужно щас учиться на простеньком коде.
Поймите же это наконец.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.06.2011, 23:41 11
Цитата Сообщение от kravam Посмотреть сообщение
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
ок, сделайте метод free который осободит память, а вызовет или не вызовет его клиент - его проблемы
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
26.06.2011, 23:47 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;
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
26.06.2011, 23:53  [ТС] 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
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
26.06.2011, 23:55 14
Вот такого поведения никто не обещал. Оно возможно, но не обязательно.
Это VC, я так понимаю? А теперь попробуйте включить оптимизацию.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
27.06.2011, 00:15  [ТС] 15
Не пойдёт. Вот смотрим эту тему начиная с сообщения N 7
Почему не вызывается конструктор копирования?

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

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

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

Так что пусть уж вызывается. Короче я всё понял, ситуация безвыходная, ладно оставлю всё как есть, я оценил твою помощь, но создавать объекты в месте, куда они должны возвратиться, не буду.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.06.2011, 00:20 16
Цитата Сообщение от kravam Посмотреть сообщение
Так, там по-моему в сообщении N 18 и 20 я чётко расписал почему мне нужен КК и почему он ВООБЩЕ нужен.
Ситуации описанные и там и здесь называются просто: ошибки проектирования. Если тебя это устраивает, что ж, дело твоё. Правда тогда непонятно к чему эти вопросы
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
27.06.2011, 00:26  [ТС] 17
Да и бессмысленно включать оптимизацию и не вызывать тем самым конструктор копирования.

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

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

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

Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ситуации описанные и там и здесь называются просто: ошибки проектирования.
прерогативу разбираться в названиях вещей я оставляю тем, кто не разбирается в самих вещах.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.06.2011, 00:29 18
Цитата Сообщение от kravam Посмотреть сообщение
Да и бессмысленно включать оптимизацию и не вызывать тем самым конструктор копирования.
Оптимизацию включают не только для этого, но глупо делать копии, когда этого можно избежать.
Цитата Сообщение от kravam Посмотреть сообщение
Но объект всё равно будет, вот в чём фишка.
А надо чтобы по использованию удалить. А никак. Вызвать деструктор- да, выполнится код, определённый в дестукторе. А объект создан в стеке, который принадлежит вызывающей функции, эта память системе не вернётся.
Сама функция его из стека и удалит сразу же после вызова деструктора. Тоже мне проблема.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
прерогативу разбираться в названиях вещей я оставляю тем, кто не разбирается в самих вещах.
А как ещё назвать код, в котором осознано допускается утечка памяти и работоспособность которого зависит от опций компиляции?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
27.06.2011, 00:52  [ТС] 19
какого деструктора? я же тебе говорю, конечный пользователь ничего не знает о классе nemo_, ёлки-палки и следовательно не должно быть в коде вызова
C++
1
~nemo_();
Добавлено через 18 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Сама функция его из стека и удалит сразу же после вызова деструктора. Тоже мне проблема.
В дизассемблер не лазил, одно знаю, есть последовательность:
Удаление объекта-> вызов деструктора
Но не наоборот.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.06.2011, 00:59 20
Цитата Сообщение от kravam Посмотреть сообщение
какого деструктора? я же тебе говорю, конечный пользователь ничего не знает о классе nemo_, ёлки-палки и следовательно не должно быть в коде вызова
Для автоматический объект явно деструктор вызывать и так нельзя. Он вызовется сам. Вызовется потому, что объект (тот-самый прокси объект, который участвует только на промежуточном этапе) вышел из области видимости.

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

Добавлено через 3 минуты
Я имею в виду именно освобождение памяти, о котором и зашла речь. Меня эта последовательность даже не интересует и я мог бы написать не после, а вместе с вызовом деструктора.
0
27.06.2011, 00:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru