Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
1

Передача объектов в методы по указателю

14.07.2012, 19:25. Просмотров 2458. Ответов 11
Метки нет (Все метки)

Здравствуйте. Тема звучит достаточно просто, но на самом деле я сформулировал её наверно недостаточно точно. Проще объяснить на примере.
Итак, есть класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
   public:
   A () {//Инициализация}
   ~A() {//Уничтожение}
   private:
   int a;
   double b; // И др. член-данные
};
void f (A* obj) {//Процедура, которая работает с объектом по указателю}
int main ()
{
  f(new A);
}
А теперь суть вопроса - в какой момент и как вызвать деструктор для объекта, созданного во время вызова процедуры. Или утечка мусора ? В самой процедуре я понял, что не вариант освобождать память. Но в языках C# или Java аналогичный приём очень часто практикуется.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2012, 19:25
Ответы с готовыми решениями:

Передача объектов в методы.
Столкнулся с небольшой проблемой несоответствия типов: Для нахождения объекта пересечения двух...

Передача объектов в функции и методы
Как лучше передавать объекты в функции и методы и почему?

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…)....

Передача по указателю и по ссылке
Всем привет! Есть функция, в которую передается ссылка: void Compare(int &p) { int * str =...

11
Нуб со стажем
36 / 34 / 10
Регистрация: 19.02.2012
Сообщений: 118
14.07.2012, 19:52 2
у тебя утечка. вот так будет лучше:
C++
1
2
3
4
5
6
int main(){
   A *obj=new A;
   f(obj);
   delete obj;
   return 0;
}
0
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:02  [ТС] 3
Я про тоже. Но просто например в Java обычно делаю так и не парюсь (и в других кодах наблюдаю). Сборщик мусора, конечно, интересная штука. То есть Вы хотите сказать, что нет больше вариантов, кроме как создать переменную отдельно, а потом передать её в метод (а потом через delete освобождать память уж наверняка)?
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 20:09 4
Цитата Сообщение от Большой_Стен Посмотреть сообщение
В самой процедуре я понял, что не вариант освобождать память
Почему? И в чём проблема? Если, после выхода из функции, объект уже не нужен, то почему бы не освободить память уже в функции?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.07.2012, 20:27 5
Большой_Стен, Есть. Использовать умные указатели. boost::shared_ptr<T>/boost::unique_ptr<T> или std::shared_ptr<T>/std::unique_ptr<T>, если есть возможность использовать С++11.
0
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:27  [ТС] 6
Насколько я Вас понял, надо писать так?
C++
1
2
3
4
5
void f(A *obj)
{
  //Что делается
   delete obj;
}
Тогда если вызывается например так, то будет очень нехорошо
C++
1
2
3
4
5
int main ()
{
    A ob;
    f(&ob);
}
В С++ нет универсального способа, чтобы и лишнюю переменную не создавать, и утечки памяти не было (по образцу из java или C#) ?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.07.2012, 20:28 7
Лучший ответ Сообщение было отмечено Большой_Стен как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
   public:
   A () {//Инициализация}
   ~A() {//Уничтожение}
   private:
   int a;
   double b; // И др. член-данные
};
void f (const std::shared_ptr<A>& obj) {//Процедура, которая работает с объектом по указателю}
int main ()
{
  std::shared_ptr<A> p(new A());
  f(p);
}
или же

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
   public:
   A () {//Инициализация}
   ~A() {//Уничтожение}
   private:
   int a;
   double b; // И др. член-данные
};
void f (const std::shared_ptr<A>& obj) {//Процедура, которая работает с объектом по указателю}
int main ()
{
  f(std::shared_ptr<A>(new A()));
}
0
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:28  [ТС] 8
С++ 11 весьма интересно. А не подскажите, сейчас в каких-нибудь IDE она поддерживается ?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.07.2012, 20:31 9
Большой_Стен, Для винды - MSVC 2012 RC отлично поддерживает новый стандарт, а так же MinGW. Собственно для Linux-а gcc. А IDE дело десятое, практически к любой IDE можно подцепить любой компилятор.
0
Эксперт С++
8300 / 6054 / 602
Регистрация: 10.12.2010
Сообщений: 28,142
Записей в блоге: 26
14.07.2012, 20:48 10
Я про тоже. Но просто например в Java обычно делаю так и не парюсь.
Забудьте про явы и шарпы. Тут нужно следить за памятью. Даже с умными указателями все равно приходится думать.

Можно конечно написать сборшик мусора для С++ как например в книге Шилда ну либо использовать VC++.
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 20:54 11
Цитата Сообщение от Большой_Стен Посмотреть сообщение
чтобы и лишнюю переменную не создавать, и утечки памяти не было
Тут как-то надо определиться, где вы хотите объект создавать, в функции или не в функции, и уже из этого исходить.

Добавлено через 4 минуты
Цитирую ваш вопрос:
Цитата Сообщение от Большой_Стен Посмотреть сообщение
в какой момент и как вызвать деструктор для объекта, созданного во время вызова процедуры
При чём здесь тогда код в 6 посте?
0
Эксперт С++
2328 / 1701 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
14.07.2012, 21:37 12
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
f(std::shared_ptr<A>(new A()));
Лучше все таки:
C++
1
f(std::make_shared<A>());
Проще читается.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2012, 21:37

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

Передача struct по указателю
Всем привет, Пытаюсь передать массив данных типа структуры: class BitmapImage { public:...

Передача параметра по указателю
Объясните пожалуйста по какой причине при вызове func(&amp;c) параметр &quot;c&quot; не меняет своего значения. ...

Передача структур по указателю
Всем привет, сейчас готовлюсь к экзамену, вопрос: передача аргументов в фанки, и возврат значений...

Передача аргумента в функцию а не по указателю
Доброе время суток помогите разобраться как сделать задача: Написать функцию, которая удаляет...


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

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

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