[英]Memory Leak in C++ CallBack Function
我是C ++的初學者,目前我正在編寫用於CallBack函數的代碼,以從CLI Wrapper連續獲取字節數組。 我的密碼
C++
**Declaration:**
void ReceivedSensor1ByteArray(unsigned char values[], int length);
**Calling:**
GetSensor1ColorsFromCsharp(&ReceivedSensor1ByteArray);
**Definition:**
byte* sensor1bytevalues;
void ReceivedSensor1ByteArray(unsigned char values[], int length)
{
if(length > 0)
{
sensor1bytevalues=new byte[length];
for(int i = 0; i < length; i++)
{
sensor1bytevalues[i]=values[i];
}
}
}
**CLI Wrapper**
**Decalration:**
public ref class SampleWrapper
{
SampleWrapper(void)
{
kinectSocketwrapperObj->ReadBytesValues+=gcnew CLIWrapperClass::ByteValuesReady(this,&Wrapper::SampleWrapper::ByteArrayReadyMethod);
}
public:
CLIWrapperClass ^ kinectSocketwrapperObj;
static SampleWrapper ^ Instance = gcnew SampleWrapper();
void ByteArrayReadyMethod(array<Byte> ^ values);
**Definition:**
GetByteArrayCallback byteArrayCallback;
__declspec(dllexport) void GetSensor1ColorsFromCsharp(GetByteArrayCallback cb)
{
byteArrayCallback = cb;
CLIWrapperClass ^KinectServerWrapper = SampleWrapper::Instance->kinectSocketwrapperObj;
KinectServerWrapper->ReceiveSensor1colors();
}
void SampleWrapper::ByteArrayReadyMethod(array<Byte> ^ values)
{
Byte *nativeValues = new Byte[values->Length];
copyManagedByteToUnfloatArray(nativeValues, values);
byteArrayCallback(nativeValues, values->Length);
}
void copyManagedByteToUnfloatArray(Byte target[], array<Byte> ^ values)
{
int maxSize = values->Length;
if ( maxSize > 0)
{
for (int index = 0; index < maxSize; index++ )
{
target[index] = (float)values[index];
}
}
}
實際上,我通過CLI Wrapper類從C#接收字節數據,並傳遞給C ++應用程序以顯示DisplayImageFrame。 當我繼續調用GetSensor1VerticesFromCSharp函數時,系統內存在10分鍾后增加,系統被掛起。 請建議我解決這個問題。
謝謝基律巴
sensor1camevalues的壽命是多長? 尚不清楚它是否是類的一部分,或者是否要復制到全局數組中,這可能會使管理其生命周期充其量很困難。
切換到使用類似std::vector
的容器,該容器將為您處理為傳感器值分配的內存,或者使用共享指針(如std::unique_ptr<float []>
初始化動態數組。 閱讀RAII /內存管理及其工作原理非常重要,因為這是C ++的關鍵概念。
如果您使用的是“真正的” c ++,而不是.Net的,則應該用“刪除”釋放分配給“新”的每個內存塊。
即:
sensor1camevalues=new float[length]; // memory allocation
delete[] sensor1camevalues; // deallocation
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.