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

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

Войти
Регистрация
Восстановить пароль
 
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
#1

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

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

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

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

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

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

Передача вектора в функцию по указателю - C++
Есть функция с таким прототипом: void Split(const string& text, char delimeter, const vector<string>* pPars); как воспользоваться...

Передача объекта по указателю в функцию - C++
Здравствуйте. При передаче объекта в метод другого объекта по указателю, метод получает непонятно что. class SomeObj { ...

11
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;
}
0
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:02  [ТС] #3
Я про тоже. Но просто например в Java обычно делаю так и не парюсь (и в других кодах наблюдаю). Сборщик мусора, конечно, интересная штука. То есть Вы хотите сказать, что нет больше вариантов, кроме как создать переменную отдельно, а потом передать её в метод (а потом через delete освобождать память уж наверняка)?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.07.2012, 20:09 #4
Цитата Сообщение от Большой_Стен Посмотреть сообщение
В самой процедуре я понял, что не вариант освобождать память
Почему? И в чём проблема? Если, после выхода из функции, объект уже не нужен, то почему бы не освободить память уже в функции?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
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 / 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#) ?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 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()));
}
0
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.07.2012, 20:28  [ТС] #8
С++ 11 весьма интересно. А не подскажите, сейчас в каких-нибудь IDE она поддерживается ?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
14.07.2012, 20:31 #9
Большой_Стен, Для винды - MSVC 2012 RC отлично поддерживает новый стандарт, а так же MinGW. Собственно для Linux-а gcc. А IDE дело десятое, практически к любой IDE можно подцепить любой компилятор.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
14.07.2012, 20:48 #10
Я про тоже. Но просто например в Java обычно делаю так и не парюсь.
Забудьте про явы и шарпы. Тут нужно следить за памятью. Даже с умными указателями все равно приходится думать.

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

Добавлено через 4 минуты
Цитирую ваш вопрос:
Цитата Сообщение от Большой_Стен Посмотреть сообщение
в какой момент и как вызвать деструктор для объекта, созданного во время вызова процедуры
При чём здесь тогда код в 6 посте?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 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>());
Проще читается.
0
14.07.2012, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 21:37
Привет! Вот еще темы с ответами:

Передача по ссылке или указателю? - C++
В каких случаях лучше передавать в функцию ссылки, а в каких указатели?

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

Передача в поток многомерных массивов по указателю - C++
Доброго всем времени суток. У меня возникло непонимание того, как можно передать двумерный (многомерный) массив в поток. Пока это...

Передача параметра по указателю в виртуальную функцию - C++
Добрый вечер и с наступающим всех Новым Годом! условие задачи такое: Мышь (абстрактный) Вход: x,y – начальные s – чувствительность ...


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

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

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