回调函数中的内存泄漏C++
本文关键字:泄漏 C++ 内存 函数 回调 | 更新日期: 2023-09-27 18:31:54
我是C++初学者,目前我正在为回调函数编写代码以从 CLI 包装器连续获取字节数组。我的代码
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包装类从C#接收字节数据,并传递给C++应用程序以显示图像帧。 当我调用GetSensor1VerticesFromCSharp函数时,系统内存在10分钟后增加,系统挂起。请建议我解决这个问题。
谢谢基鲁巴
sensor1camevalues 的寿命是多少?目前尚不清楚它是类的一部分,还是要复制到全局数组中,这最多只能使管理它的生命周期变得困难。
切换到使用像 std::vector
这样的容器,它将为您处理为传感器值分配内存,或者使用共享指针(如 std::unique_ptr<float []>
)来初始化动态数组。阅读RAII/内存管理及其工作原理非常重要,因为这是C++的关键概念。
如果你
是关于"真正的"c ++,而不是.Net one,你应该用"删除"来释放每个分配有"new"的内存块。
即:
sensor1camevalues=new float[length]; // memory allocation
delete[] sensor1camevalues; // deallocation