C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Допоплнительные проверки  (Прочитано 1187 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Допоплнительные проверки
« : 14 Апрель 2015, 14:19:33 »

Нет ли в этом коде утечек памяти? Нужны ли здесь какие-то дополнительные проверки?
Код
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
String Login;
bool Aut;
bool ProverkaSetup;
int PeriodTime;
String Otvet;
BYTE  * RamdomData;
__fastcall TMyData(int aValue, int aCoutSens, String sLogin, bool sAut, bool sProverkaSetup,
int aPeriodTime, String aOtvet, BYTE *aRamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet)
{
 RamdomData = new BYTE[16];
 memcpy((void*)RamdomData,(void*)aRamdomData,16);
}
 
__fastcall ~TMyData()
{
 if(RamdomData)
 delete [] RamdomData;//диструктор правильный?
}
};
 

Код
void __fastcall TForm1Main::IdTCPServer1Connect(TIdContext *AContext)
{
//***
Randomize();
  BYTE Data[16];
  for(int i = 0; i 16; i++)
{
BYTE rnd = Random(256);
Data[i] = rnd;
 
//***
AContext->Data = new TMyData(0, 0,"", false, false, 0, "", Data);
 
 

Код
//В другом месте программы используем
String s;
BYTE Data[16];
memcpy((void*)Data,(void*)static_castTMyData*>(AContext->Data)->RamdomData,16);
 for(int i = 0; i 16; i++)
{
 BYTE rnd = Data[i];
s += IntToHex(rnd&0xFF,2);
}
 

//в IdTCPServer1Disconnect
Код
if(AContext->Data)
{
 delete AContext->Data;
 AContext->Data = NULL;
}
 
Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Допоплнительные проверки
« Ответ #1 : 14 Апрель 2015, 17:24:25 »

Вроде, не должно быть утечек.
Здесь,пожалуй, копирование памяти можно не делать
Код:
//В другом месте программы используем
 String s;
 BYTE Data[16];
 memcpy((void*)Data,(void*)static_cast(AContext->Data)->RamdomData,16);
  for(int i = 0; i {
  BYTE rnd = Data[i];
s += IntToHex(rnd&0xFF,2);
}
А сделать так
Код:
//В другом месте программы используем
 String s;
 BYTE *Data=(BYTE*)(static_cast(AContext->Data)->RamdomData);
  for(int i = 0; i {
  BYTE rnd = Data[i];
s += IntToHex(rnd&0xFF,2);
}
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #2 : 14 Апрель 2015, 18:58:35 »

Большое спасибо!

P.S.
В диструкторе убрать наверное if(RamdomData)?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.129 секунд. Запросов: 19.