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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 17:17   #11
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
Отвечаю на твой вопрос. Твой объект удаляется, когда выходит за scope (то есть доходит до "}") в случае обычного создания или когда ты делаешь delete в случае динамического создания. Деструктор нужно писать если тебе нужно помимо удаления объекта сделать ещё что-то (например, освободить динамически выделенную память под его поля).
Т.е. память не высвободится не в одном из случаев? Деструктором высвобождаем память? Спасибо всем!!! - очень помогли

Последний раз редактировалось GerNick; 11.03.2011 в 17:23.
GerNick вне форума Ответить с цитированием
Старый 11.03.2011, 17:29   #12
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
как написать деструктор:

Код:
class myClass
{
    public:
        myClass ( /*тут список параметров*/); // объявление конструктора
        ~myClass ()                           // объявление деструктора
/*
     описание класса
*/   
};

// конструктор класса
myClass::myClass (/*тут список параметров*/)
{
     // тут код, срабатывающий в момент создания объекта класса
}

myClass::~myClass () // деструктор -- ничего не делает
{
}
Вот как-то так, если канонически... -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 13.03.2011, 18:58   #13
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Т.е. память не высвободится не в одном из случаев? Деструктором высвобождаем память? Спасибо всем!!! - очень помогли
какая память?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 14.03.2011, 08:39   #14
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
Печаль

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
какая память?
Динамически выделенная для Объекта класса или в стеке.
Неужели я ЗАПУТАЛСЯ
GerNick вне форума Ответить с цитированием
Старый 14.03.2011, 12:52   #15
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вот смотрите
Код:
class MyClass
{
public:
MyClass();
~MyClass();
private:
char* str;
int len;
};

MyClass::MyClass():
 len(18)
 {
 str = new char[18];
 strcpy(str, "This is a string!");
 }
MyClass::~MyClass()
 {
 delete[] str;
 }

void f()
{
MyClass* A = new MyClass;   //Вызывается конструктор, создаются поля класс len (инициализируется значением 18), создается указатель str. В теле конструктора выделяется память под массив символов, указателю присваивается значение, в эту память копируется строка.
delete A;   //Вызывается тело деструктора - удаляется память, на которую указывает str. После завершения работы тела деструктора удаляются переменные len и str (указатель), а также подчищаются прочие ресурсы, нужные для работы класса
}
Если не определять деструктор, или определить пустой деструктор, то при уничтожении объекта поля класса - переменная len типа int и переменная str типа char* все равно благополучно удалятся, однако память, выделенная в конструкторе, не будет освобождена. Освобождение этой памяти - задача программиста, поэтому в деструкторе необходимо вызвать delete[] str; Т.е. в самом теле деструктора должны освобождаться ресурсы, захваченные явным образом (например, память, выделенная по new), а память, выделенная автоматически для полей класса, освобождается не менее автоматически.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.03.2011, 15:27   #16
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Вот смотрите
Код:
class MyClass
{
public:
MyClass();
~MyClass();
private:
char* str;
int len;
};

MyClass::MyClass():
 len(18)
 {
 str = new char[18];
 strcpy(str, "This is a string!");
 }
MyClass::~MyClass()
 {
 delete[] str;
 }

void f()
{
MyClass* A = new MyClass;   //Вызывается конструктор, создаются поля класс len (инициализируется значением 18), создается указатель str. В теле конструктора выделяется память под массив символов, указателю присваивается значение, в эту память копируется строка.
delete A;   //Вызывается тело деструктора - удаляется память, на которую указывает str. После завершения работы тела деструктора удаляются переменные len и str (указатель), а также подчищаются прочие ресурсы, нужные для работы класса
}
Если не определять деструктор, или определить пустой деструктор, то при уничтожении объекта поля класса - переменная len типа int и переменная str типа char* все равно благополучно удалятся, однако память, выделенная в конструкторе, не будет освобождена. Освобождение этой памяти - задача программиста, поэтому в деструкторе необходимо вызвать delete[] str; Т.е. в самом теле деструктора должны освобождаться ресурсы, захваченные явным образом (например, память, выделенная по new), а память, выделенная автоматически для полей класса, освобождается не менее автоматически.
..." а память, выделенная автоматически для полей класса, освобождается не менее автоматически" - это имеется ввиду освобождается автоматически?
GerNick вне форума Ответить с цитированием
Старый 14.03.2011, 15:31   #17
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

ВОТ МОЙ КОД:

class cMODBUS_RTU //cDataLinkLayer_RTU
{
public:
cMODBUS_RTU(unsigbyte , unsigword * , unsigbyte * , unsigbyte * , unsigbyte * );
~cMODBUS_RTU();
int Data_transport(unsigbyte* , unsigbyte );//
unsigbyte tx_buffer[256];//буфер передачи
int cnt_buf; //счётчик принятых
private:
unsigbyte Dev_Address;
unsigbyte rx_buffer[256];//приемный буфер
unsigbyte buf_PDU[253];//буфер PDU
//
unsigword buf_applRW[125+2];//буфер Чтения/Записи данных регистров (для Прикладного уровня)

int cnt_buf_PDU;//счётчик количества данных передачи в PDU буфере
unsigword crc16;// подсчёт контрольной суммы
int cnt_tx_buf; //счётчик передаваемых байт
int ExceptionCode;//Код ошибки - не нужен
unsigbyte* p_buffer_rx; // Указатель на буфер приёма MODBUS
unsigbyte* p_buffer_tx; // Указатель на буфер передачи MODBUS
/////////////////////////////
int Data_Link_layer(unsigbyte* , unsigbyte );// канальный уровень
void PDU_toTX ();//
void ErrorTrans (unsigbyte *, unsigbyte );
unsigword CRC16 ( unsigbyte *, int );
sMODBUS_INTERFACE_DIAGNOSTIC MODBUS_Diagnostic_count ;
};



cMODBUS_RTU::cMODBUS_RTU (unsigbyte Device_Address, unsigword * p_Diag_Reg, unsigbyte * p_Excep_Stat, unsigbyte * p_SlaveID, unsigbyte * p_AdData17)
{ //ctor
// ;// размер объекта
p_buffer_rx=rx_buffer;// Указатель на буфер приёма MODBUS
p_buffer_tx=tx_buffer;// Указатель на буфер передачи MODBUS
Dev_Address=Device_Address;
//
cnt_buf_PDU=0;//счётчик количества данных передачи в PDU буфере
cnt_buf=0; //счётчик принятых
cnt_tx_buf=0;//счётчик передаваемых байт
//ExceptionCode=0;//Код ошибки
/////////////////////////////

MODBUS_Diagnostic_count.p_Diag_Reg = p_Diag_Reg;//Указатель на Регистр ДИАГНОСТИКИ
MODBUS_Diagnostic_count.p_Excep_Sta t = p_Excep_Stat;//Указатель на Регистр Статуса
MODBUS_Diagnostic_count.p_SlaveID= p_SlaveID;
MODBUS_Diagnostic_count.p_AdditData Func17= p_AdData17;//Инициализация должна проходить в main
//
Init_application_layer (&MODBUS_Diagnostic_count);

//
//Регистр диагностики - либо указатель на сам регистр диагностики
// либо указатель на указатель регистра диагностики в (DATA MAPPING)
//
//

}

cMODBUS_RTU::~cMODBUS_RTU ()
{ //dtor
//

}

В моём случае деструктор пустой - это НОРМАЛЬНО ЖЕ?
GerNick вне форума Ответить с цитированием
Старый 14.03.2011, 17:29   #18
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
В моём случае деструктор пустой - это НОРМАЛЬНО ЖЕ?
Нормально.
Цитата:
..." а память, выделенная автоматически для полей класса, освобождается не менее автоматически" - это имеется ввиду освобождается автоматически?
Это означает, что вам не нужно заботиться о выделении/освобождении памяти под переменные-поля класса
Код:
class A
{
puplic:
A();
~A();
private:
int b;
bool c;
};
Память под переменные b и c выделяется/освобождается автоматически (да и вообще, совершенно непонятно, почему бы могло быть иначе). Так что это забота компилятора. Указатели сами по себе - это тоже переменные, поэтому если бы было еще поле, к примеру, char* d; то память, выделенная под нее - тоже целиком в ведении компилятора, не забивайте себе голову этим.
Другой вопрос, что в соответствующих случаях необходимо выделить память, например, под строку, и для этого в конструкторе может быть нужно вызвать оператор new, а в деструкторе тогда - оператор delete. Но при этом важно понимать, что есть переменная-указатель (char* d - памятью для нее занимается компилятор), а есть область памяти, на которую он указывает (если вы выделили эту память оператором new в конструкторе, то вам и освобождать ее оператором delete в деструкторе).
Раз вы не выделяли память ни в конструкторе, ни где-то еще, то и освобождать ее в деструкторе не надо.
Тело деструктора выполняет только ту работу, которую не может и не должен выполнять компилятор. В частности, освобождать память под поля класса он может и должен - вам не нужно пытаться это сделать в деструкторе, это часть работы компилятора.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 15.03.2011, 08:30   #19
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Спасибо Вам Всем! Разобрался! Всё понял!
GerNick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
КЛАССЫ. КОНСТРУКТОРЫ. ДЕСТРУКТОРЫ. LeNus'Ka Помощь студентам 4 24.11.2010 17:11
Конструкторы и деструкторы @arkadii Общие вопросы C/C++ 2 10.11.2010 17:40
С++ и С# Конструкторы и Деструкторы exKenny Помощь студентам 1 27.04.2010 12:32
Классы. Конструкторы и деструкторы. Freddy_Krueger Помощь студентам 1 29.11.2009 13:12