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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
#1

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

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

Собсно


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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2011, 22:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! (C++):

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

Используя условия вариантов записать все вычисления , проводимые ранее в основной программе , в виде процедуры. В основной программе предусмотреть т - Delphi
Используя условия вариантов записать все вычисления , проводимые ранее в основной программе , в виде процедуры. В основной программе...

Как создать объект оператором new, если имеется только тип указателя на объект, переданный через шаблон? - C++ Builder
Есть шаблон. Точно известно, что его параметр Т это указатель. Как с помощью new создать переменную типа *T ? Код приведенный ниже дает...

Что будет с указателем после использования операции delete? - C++
Имеется код: #include <iostream> using namespace std; int main() { int *wtf_ptr; wtf_ptr=new int(8);

Как сделать невидимым консольное окно в программе, вызывающей диалог? - C++ WinAPI
Простая тестовая программа#include <Windows.h> int main(int argc, char* argv) { MessageBox(NULL, "Окно", "Заголовок окна",...

Как удалить объект, по его Handle - Delphi WinAPI
Как, зная Хендл объекта чужого приложения, удалить его?

55
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.06.2011, 22:47 #2
а сделать указатель мембером класса и удалять в деструкторе, не?
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 22:54 #3
По сути этот код эквивалентен напрмер такому:
C++
1
2
const char *s = "string";
strdup(s);
Если ничего не менять, то по-моему утечка неизбежна.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
26.06.2011, 22:54  [ТС] #4
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
0
grizlik78
Эксперт С++
1982 / 1475 / 126
Регистрация: 29.05.2011
Сообщений: 3,048
26.06.2011, 22:58 #5
Из строк 19—21 так и не понятно, нужен ли указатель на nemo_ в вызывающей функции хоть для чего-то?
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.06.2011, 23:03 #6
Раз функция только создает обьет nemo_, а пользователь об нем ничего не знает, то получается код который должен выполнится может находится только в конструкторе nemo_
Может стоит например просто перенести код из конструктора nemo_ в тело функии funktsia?
0
grizlik78
Эксперт С++
1982 / 1475 / 126
Регистрация: 29.05.2011
Сообщений: 3,048
26.06.2011, 23:06 #7
Вот мне и непонятно, зачем возвращается ссылка на этот объект, если пользователю он не нужен и пользователь о нём и знать не знает. Тогда его надо удалить там же, где он и создался, то есть прямо в funktsia() и ничего не возвращать. В общем, теряюсь в догадках...
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
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
grizlik78
Эксперт С++
1982 / 1475 / 126
Регистрация: 29.05.2011
Сообщений: 3,048
26.06.2011, 23:22 #9
Цитата Сообщение от kravam Посмотреть сообщение
А зачем вам знать?
На вопрос "Как сделать что-нибудь" есть только один правильный ответ: "Как-нибудь".

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

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

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

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

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

То есть что последую я вашему совету, что оставлю всё как есть с точки зрения сложности кода и расхода памяти- всё едино. А вот научиться заявленному не научусь. А нужно щас учиться на простеньком коде.
Поймите же это наконец.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.06.2011, 23:41 #11
Цитата Сообщение от kravam Посмотреть сообщение
Не. Это тогда объект класса nemo_уничтожится только по вызову (читай: по уничтожению xx) деструктора класса xx; а это будет нескоро, класс xx мне нужен ещё считай до конца пограммы.
ок, сделайте метод free который осободит память, а вызовет или не вызовет его клиент - его проблемы
0
grizlik78
Эксперт С++
1982 / 1475 / 126
Регистрация: 29.05.2011
Сообщений: 3,048
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
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
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
grizlik78
Эксперт С++
1982 / 1475 / 126
Регистрация: 29.05.2011
Сообщений: 3,048
26.06.2011, 23:55 #14
Вот такого поведения никто не обещал. Оно возможно, но не обязательно.
Это VC, я так понимаю? А теперь попробуйте включить оптимизацию.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
27.06.2011, 00:15  [ТС] #15
Не пойдёт. Вот смотрим эту тему начиная с сообщения N 7
Почему не вызывается конструктор копирования?

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

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

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

Так что пусть уж вызывается. Короче я всё понял, ситуация безвыходная, ладно оставлю всё как есть, я оценил твою помощь, но создавать объекты в месте, куда они должны возвратиться, не буду.
0
27.06.2011, 00:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 00:15
Привет! Вот еще темы с ответами:

Как использовать объект класса, созданого в определеном классе, в другом классе - C#
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

Подключение M-функции к основной программе - Matlab
Здравствуйте. У меня есть M-функция, которая находит сумму всех элементов одномерного массива, стоящих на нечетных местах: ...

Как освободить память (ресурс) после его использования - C#
private void installButton_MouseEnter(object sender, EventArgs e) { installButton.Image =...

После использования функции strtok, как обращаться к лексемам? - C (СИ)
После использования функции strtok, как мне обращаться к лексемам? Допустим разбил я предложение мама мыла раму на 3 слова, теперь...


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

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

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