PSD
Главный специалист
Offline
Пол:
|
|
« : 01-09-2006 05:51 » |
|
Есть такой код class TCP_Buf {public : int MaxLen; int Len; char * Buf; TCP_Buf(void) { TCP_Buf(MAX_TCP_BUF); }; TCP_Buf(int size) { if (size>0 && size<=MAX_TCP_BUF) { Buf=new char[size]; MaxLen=size; }; } ~TCP_Buf(void) { delete Buf; MaxLen=0;
};
}; class factori { TCP_Buf m_Buf; factori(); }
При создании экземпляра объекта factori
вызывается TCP_Buf(void) отрабатывает и затем почемуто сразу вызывается деструктор... ~TCP_Buf()
В итоге отладчиком в factori(); я вижу не мнициализированные поля
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #1 : 01-09-2006 06:25 » |
|
всё очень просто вот это TCP_Buf(void) { TCP_Buf(MAX_TCP_BUF); }; конструирование временного объекта TCP_Buf внутри конструктора TCP_Buf как только конструкто отработает он уничтожит данные сделай так class TCP_Buf { void init(int size) { if (size>0 && size<=MAX_TCP_BUF) { cout << "TCP_Buf::TCP_Buf(n)\n"; Buf=new char[size]; MaxLen=size; } }
public : int MaxLen; int Len; char * Buf;
TCP_Buf(int size) { init(size); }
TCP_Buf(void) { cout << "TCP_Buf::TCP_Buf\n"; init(MAX_TCP_BUF);
} ~TCP_Buf(void) { delete Buf; MaxLen=0; cout << "TCP_Buf::~TCP_Buf\n";
} };
я бы еще конструкторы объеденил в один TCP_Buf(int size = MAX_TCP_BUF)
|
|
|
Записан
|
Странно всё это....
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #2 : 01-09-2006 06:33 » |
|
Спасибо вы конечно правы. Вызов коструктора равносилен созданию объекта (((((
(Блин, сначала "where id_count=225" вместо "where id_count=225 or id_count is null" в запросе с left join, теперь конструктор .... похоже пришло время снова брать отпуск.... )
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 01-09-2006 06:41 » |
|
PSD, вообще вроде все тут на ты. возможно можно конструктор из конструктора вызвать если использовать конструкцию new(this) TCP_Buf(n); т.е. конструирование поверх текущего объекта
|
|
|
Записан
|
Странно всё это....
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #4 : 01-09-2006 07:20 » |
|
Это получается как создание обекта класса в собственном буфере?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 01-09-2006 07:30 » |
|
да на вроде этого, только отдаём указатель на себя. это кстати вполне работает, только, что проверил, но выглядит это, как грязный хак.
|
|
|
Записан
|
Странно всё это....
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #6 : 01-09-2006 07:39 » |
|
Хм, это получается что в принципе конструктор можно вызвать из любой функции ....
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #7 : 01-09-2006 09:01 » |
|
да на этом построенны аллокаторы просто я не разу не пробовал вызывать собственный конструктор из нутри объекта.
|
|
|
Записан
|
Странно всё это....
|
|
|
nikedeforest
|
|
« Ответ #8 : 01-09-2006 14:57 » |
|
new(this) TCP_Buf(n);
Извините за глупый вопрос, но хотелось бы узнать, здесь конструкция (this) служит как бы приведением к типу?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 01-09-2006 15:08 » |
|
Извините за глупый вопрос, но хотелось бы узнать, здесь конструкция (this) служит как бы приведением к типу? this - не тип, а типизированный указатель на объект, т.е. приведением это быть не может. Зачем она там - не могу сказать . Вероятно, это связано с декларацией new, и таким образом this используется как адрес, по которому new выполняет все действия.
|
|
« Последнее редактирование: 01-09-2006 15:11 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 01-09-2006 15:39 » |
|
возможно можно конструктор из конструктора вызвать если использовать конструкцию new(this) TCP_Buf(n); т.е. конструирование поверх текущего объекта
имелось в виду наверное так: this= new TCP_Buf(n); а утечки памяти не будет?
|
|
« Последнее редактирование: 01-09-2006 15:45 от Алексей1153 »
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #11 : 04-09-2006 04:29 » |
|
Нет, если я правельно понял, имелось виду именно следующее: оператор new позволяет создавать экзепляры обекта класса не только в куче(с выделенем памяти) но и в произвольном буфере адрес буфера передается в скобках.
new (pointer) type
В данном случае приводился пример как можно вызвать конструктор класса, мы просто передаем new указатель на сам эекземпляр объекта , что приводит к пересозданию объекта на томже месте. Учитывая что память в С ни при выделении ни при освобождении не "очищается" теоретически мы можем влюбой момент вызвать конструктор класса из любого другого метода.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #12 : 04-09-2006 05:22 » |
|
PSD, ты абсолютно прав можно сделать malloc стразу на 100 мегов и засовывать туда те объекты которые тебе хочится. this используем, как указатель на себя и вот эта конструкция new(this) TCP_Buf(n); в конструкторе TCP_Buf говорить сконструировать объект прямо поверх уже созданного объекта. Из серии, что не запрещено, то разрешено Алексей1153, целью было было вызвать один конструктор изнутри друго-го(как обычный метод) при инниализации объекта, а не создавать новый объект
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 04-09-2006 07:17 » |
|
PSD, LogRus, то есть мы делаем
MYTYPE xxx(...); memmove(pointer,&xxx,sizeof(xxx));
(где pointer - указатель на "чистый" буфер?)
?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #14 : 04-09-2006 07:30 » |
|
при чем тут memmove
new(pointer) TObj(arg) означает сконструировать объект по адресу pointer используя конструктор TObj::TObj(param arg) ничего ни куда не двигаем просто вызываем конструктор для ранее аллоцированной памяти, память может быль аллоцирована через malloc или например через boost::pool(у нас активно используется там, где много выделений/удалений памяти)
|
|
|
Записан
|
Странно всё это....
|
|
|
|