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

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

Войти
Регистрация
Восстановить пароль
 
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 19:25     Передача объектов в методы по указателю #1
Здравствуйте. Тема звучит достаточно просто, но на самом деле я сформулировал её наверно недостаточно точно. Проще объяснить на примере.
Итак, есть класс
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 аналогичный приём очень часто практикуется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2012, 19:25     Передача объектов в методы по указателю
Посмотрите здесь:

Передача массива в функцию по указателю C++
C++ Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Передача по указателю и по ссылке C++
передача объектов в функции и методы C++
C++ Передача объекта по указателю в функцию
C++ Передача по ссылке или указателю?
Передача struct по указателю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kent
Нуб со стажем
 Аватар для kent
36 / 34 / 2
Регистрация: 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;
}
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:02  [ТС]     Передача объектов в методы по указателю #3
Я про тоже. Но просто например в Java обычно делаю так и не парюсь (и в других кодах наблюдаю). Сборщик мусора, конечно, интересная штука. То есть Вы хотите сказать, что нет больше вариантов, кроме как создать переменную отдельно, а потом передать её в метод (а потом через delete освобождать память уж наверняка)?
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 20:09     Передача объектов в методы по указателю #4
Цитата Сообщение от Большой_Стен Посмотреть сообщение
В самой процедуре я понял, что не вариант освобождать память
Почему? И в чём проблема? Если, после выхода из функции, объект уже не нужен, то почему бы не освободить память уже в функции?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.07.2012, 20:27     Передача объектов в методы по указателю #5
Большой_Стен, Есть. Использовать умные указатели. boost::shared_ptr<T>/boost::unique_ptr<T> или std::shared_ptr<T>/std::unique_ptr<T>, если есть возможность использовать С++11.
Большой_Стен
13 / 13 / 1
Регистрация: 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#) ?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
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()));
}
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:28  [ТС]     Передача объектов в методы по указателю #8
С++ 11 весьма интересно. А не подскажите, сейчас в каких-нибудь IDE она поддерживается ?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.07.2012, 20:31     Передача объектов в методы по указателю #9
Большой_Стен, Для винды - MSVC 2012 RC отлично поддерживает новый стандарт, а так же MinGW. Собственно для Linux-а gcc. А IDE дело десятое, практически к любой IDE можно подцепить любой компилятор.
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 17
14.07.2012, 20:48     Передача объектов в методы по указателю #10
Я про тоже. Но просто например в Java обычно делаю так и не парюсь.
Забудьте про явы и шарпы. Тут нужно следить за памятью. Даже с умными указателями все равно приходится думать.

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

Добавлено через 4 минуты
Цитирую ваш вопрос:
Цитата Сообщение от Большой_Стен Посмотреть сообщение
в какой момент и как вызвать деструктор для объекта, созданного во время вызова процедуры
При чём здесь тогда код в 6 посте?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 21:37     Передача объектов в методы по указателю
Еще ссылки по теме:

Передача в функцию по ссылке или указателю C++
Передача параметров в функцию по значению, по ссылке и по указателю C++
Передача аргументов в функцию по ссылке и указателю C++
Передача параметра по указателю в виртуальную функцию C++
C++ Передача в поток многомерных массивов по указателю

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 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>());
Проще читается.
Yandex
Объявления
14.07.2012, 21:37     Передача объектов в методы по указателю
Ответ Создать тему
Опции темы

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