최근 레이저의 광출력을 측정하는 계측기를 사용하는 과정에서 해당 계측기 업체가 제공하는 소스를 그대로 복사해서 함수를 하나 만들어서 사용을 했습니다.
그런데 이 장비가 번인 장비여서 기본적으로 1000시간 이상 구동을 해야 하는데 200~300 시간 정도 지나면 프로그램이 다운이 되어 버리는 증상이 나타났습니다. 아무리 소스 코드를 봐도 오류를 찾을 수 없었는데 혹시나 해서 계측기 업체가 제공한 소스 코드를 Chat-GPT 에 돌려서 보니 VARIANT 형을 사용하는 과정에서 변수를 Clear 하지 않아서 오버플로우가 발생하는 현상이 있는 것을 찾아 냈습니다.
아래 함수가 이번에 수정한 부분인데 VARIANT value, param1, param2; 이 세개의 변수가 VARIANT 형으로 선언이 되어 있고 그 중에서 value 변수는 배열 형식으로 데이타를 받아 오도록 되어 있습니다.
VARIANT 변수가 단일 변수형식일 경우에는 상관 없다고 하는데 배열이나 문자열 같이 데이타가 큰 형식으로 변경이 될 경우에는 반드시 변수를 Clear 해주어야만 메모리 오버플로우가 발생하지 않습니다.
아래 함수를 try finally 구문을 이용해서 함수가 마무리되면 VariantClear() 를 이용해서 메모리 해제를 시켜 주었고 이렇게 코드를 수정한 이후에는 프로그램이 다운되지 않고 정상적으로 잘 동작합니다.
C++ builder 에서는 Variant 라는 형으로 VARIANT 형을 사용하는데 빌더에서 만든 Variant 형은 자동으로 메모리 해제가 되도록 프로그램 되어 있어서 사용자가 메모리 해제를 신경쓰지 않아도 됩니다.
bool __fastcall TAging::readPowerData(const int Channel)
{
VARIANT value, param1, param2;
int check = -1 ;
double Power ;
bool result = true ;
try
{
try
{
check = g_PowerMeter->GetData(ChannelInformation[Channel].Handle, 0, &value, ¶m1, ¶m2) ;
if(check != 0) result = false ;
else
{
std::vector<double> PowerData = getDoubles(value) ;
if(PowerData.size() > 0)
{
Power = PowerData[0] ;
Power = (Power * MachineData.PowerCalibration[Channel][0]) + MachineData.PowerCalibration[Channel][1] ;
ChannelInformation[Channel].MeasData.Power = Power ;
}
else
{
result = false ;
}
}
}
catch(...)
{
check = -1 ;
result = false ;
}
}
__finally
{
VariantClear(&value);
VariantClear(¶m1);
VariantClear(¶m2);
}
return result ;
}
'Software > C++ Builder' 카테고리의 다른 글
IEEE754 단정밀(32Bit) 데이타와 float 형 변수의 상호 변환 - C++ (0) | 2025.03.17 |
---|---|
HEX String 을 Integer 값으로 변경하는 방법 (0) | 2023.06.07 |
윈도우 강제 Shut Down 시키기 (0) | 2023.06.07 |
c++ Builder 외부 에디터 연결 사용방법 (0) | 2023.03.31 |
Excel 설치없이 Excel 파일로 데이타 저장 C++ (0) | 2023.03.23 |