Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2015, 15:29   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию Консультация по объектам

Здравствуйте господа гуру С++

Не буду рассусоливать - сразу вопрос на примере:

Каким образом освобождается память под объект А в таком коде

Код:
int _fastcall MyFunction(int objecttype)
{
   TMyObject A;  
   int ret = A.GetObjectCount(objecttype);
   return ret;
}
уточнение:
TMyObject - это класс который содержит внутреннее хранилище информации. Метод GetObjectCount наполняет внутреннее хранилище данными, делает определённые вычисление и возвращает число определённых объектов по типу "objecttype"

Деструктор очищает всю память но явно не вызывается в функции MyFunction
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 10.11.2015 в 15:37.
JUDAS вне форума Ответить с цитированием
Старый 10.11.2015, 15:36   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Функция заканчивается - время жизни объекта проходит и вызывается деструктор.
p51x вне форума Ответить с цитированием
Старый 10.11.2015, 15:39   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Функция заканчивается - время жизни объекта проходит и вызывается деструктор.
То есть, программист не контролирует жизнь объекта который объявлен внутри функции? Утечек памяти не будет (при условии что деструктор срабатывает корректно?)

п.с. уточняю, ибо в Делфи всё что создаётся внутри функции должно обязательно освобождаться (такой принцип программирования), а в С++ вижу всё на самотёке, как и в JavaScript
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 10.11.2015, 16:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Не на самотеке, а просто чуть синтаксического сахара. В делфи вы и конструктор явно вызываете. Создавайте через new и удаляте delete, если вам так хочется.
p51x вне форума Ответить с цитированием
Старый 11.11.2015, 12:09   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
То есть, программист не контролирует жизнь объекта который объявлен внутри функции? Утечек памяти не будет (при условии что деструктор срабатывает корректно?)

п.с. уточняю, ибо в Делфи всё что создаётся внутри функции должно обязательно освобождаться (такой принцип программирования), а в С++ вижу всё на самотёке, как и в JavaScript
не на самотеке, тут вполне строгий принцип.
в С++ есть явное различие как хранятся данные, в стеке или в куче.
В Делфи всегда хранятся в куче, потому и надо явно освобождать.
В С++ же то что в куче освобождать надо, то что в стеке умрет само.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2015, 15:25   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Господа, спасибо всем !
Уточняющий вопрос по теме.
--------------
Фрагмент кода:

Код:
TMyObject& _fastcall MyFunction(int objecttype)
{
   TMyObject A;  
   A.InitObject(objecttype);
   return A;
}
-------------------------------
вызываю с другой функции
{
   char * data = MyFunction(16);
   // работаю с data
   ........

}
Вопрос, в каком месте будет освобождена память по объект TMyObject и будет ли она валидна в точке "....." если при условии что класс объявлен вот так:


Код:
TMyObject = class
   public:
      TMyObject() Data
     {
       Data=0; 
       size=0; 
     }
      ~TMyObject(){delete[]Data; Data=0; size=0;};
      void      InitObject(){создание Data через new и наполнение};
   protected:
     char * Data;
     int     size;
}
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 12.11.2015, 15:30   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще такой код должен выдавать варнинг. и это плохой код.
ибо передача ссылки на локальную переменную.
InitObject можно и в конструкторе делать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2015, 22:30   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вообще такой код должен выдавать варнинг. и это плохой код.
ибо передача ссылки на локальную переменную.
InitObject можно и в конструкторе делать.
Можно но тогда ещё два вопроса
1. Как объявить объект класса без использования указателей
во так TMyObject A;
если конструктор содержит несколько параметров. Веди инициализацию объекта в примере указана "приммитивная", на самом деле идёт настройка внутренних свойств самого класса, открывается (или создаётся файл) и так далее

2. Вопрос немного не в тему
В С++ имеется функция типа Format которая содержит плавающее число параметров "...". Вопрос, как мне создать такой же метод в классе

Выдаёт вот такое
[C++ Error] nuclearcalc.h(157): E2138 Conflicting type modifiers
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось Stilet; 13.11.2015 в 11:10.
JUDAS вне форума Ответить с цитированием
Старый 13.11.2015, 05:57   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
1. Как объявить объект класса без использования указателей
во так TMyObject A;
если конструктор содержит несколько параметров.
TMyObject A(params);

Цитата:
В С++ имеется функция типа Format которая содержит плавающее число параметров "...". Вопрос, как мне создать такой же метод в классе
https://msdn.microsoft.com/en-us/library/fxhdxye9.aspx
p51x вне форума Ответить с цитированием
Старый 13.11.2015, 10:12   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

За первое спасибо, попробую.
По поводу функции с ...
Функция то работает, с ней вопросов нет, а вот метод создать не получается. Выдаёт
[C++ Error] nuclearcalc.h(157): E2138 Conflicting type modifiers

код

Код:
TMyObject = class
   public:
      TMyObject() Data
     {
       Data=0; 
       size=0; 
     }
      ~TMyObject(){delete[]Data; Data=0; size=0;};
      void      InitObject(){создание Data через new и наполнение};

      int _fastcall MyMethod(int code, int type, ...) << [C++ Error] nuclearcalc.h(157): E2138 Conflicting type modifiers
      {
        бла бла бла
      }

   protected:
     char * Data;
     int     size;
}
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к объектам Sanek_ntsk Общие вопросы Delphi 3 14.04.2012 18:41
пройтись по объектам формы iliili Общие вопросы Delphi 3 16.06.2011 14:29
Вопросы по объектам BadProgrammer Общие вопросы C/C++ 1 20.12.2010 03:34
привязка к динамическим объектам areyoudead Общие вопросы Delphi 7 04.11.2010 14:15
вопрос по объектам на паскале demonara Помощь студентам 7 09.09.2009 20:52