C++ 为什么enqueueAcquireGLObjects()在此OpenCL代码中泄漏内存?

C++ 为什么enqueueAcquireGLObjects()在此OpenCL代码中泄漏内存?,c++,memory,memory-leaks,opencl,C++,Memory,Memory Leaks,Opencl,当我在一个包含400K元素的循环中运行以下OpenCL代码时,内存开始泄漏 std::vector<cl::Memory> cl_vbos; glFinish(); cl_vbos.push_back(cl::BufferGL(context, CL_MEM_READ_WRITE, VBOs.back(), &err)); queue.enqueueAcquireGLObjects(&cl_vbos, NULL, &event); queue.enqueueN

当我在一个包含400K元素的循环中运行以下OpenCL代码时,内存开始泄漏

std::vector<cl::Memory> cl_vbos;
glFinish();
cl_vbos.push_back(cl::BufferGL(context, CL_MEM_READ_WRITE, VBOs.back(), &err));
queue.enqueueAcquireGLObjects(&cl_vbos, NULL, &event);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(globalWorkSize), cl::NDRange(localWorkSize), NULL, &event);
queue.enqueueReleaseGLObjects(&cl_vbos, NULL, &event);
glFinish();
queue.finish();
程序停止泄漏内存。奇怪的是,内存不是在GPU上泄漏,而是在CPU上泄漏。我做错什么了吗?忘了释放一些东西


我正在使用NVIDIAs OpenCL 1.1和Windows 7 64位和VC++上的最新驱动程序。

经过无数个小时的调试,我终于解决了这个问题。在我看来,这个问题与英伟达有关。我会把我的补丁留在这里,以防有人有同样的问题

将事件传递给以下任一函数时:

queue.enqueueAcquireGLObjects()
queue.enqueueNDRangeKernel()
...
将创建一个新指针,并且该指针永远不会被释放。修复程序未使用事件(&E):

queue.enqueueAcquireGLObjects(&cl_vbos, NULL, NULL);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(globalWorkSize), cl::NDRange(localWorkSize), NULL, NULL);
queue.enqueueReleaseGLObjects(&cl_vbos, NULL, NULL);
我相信:

event.wait();

事件排队后也会修复泄漏,但尚未深入测试此解决方案。

您确定这是真正的泄漏吗?或者某个库泄漏不会真正泄漏到无限大的RAM?。在英伟达驱动程序方面,它看起来很糟糕。你可以尝试CLYVBOS(0)吗?每次从OpenCL API中得到一个事件,你就负责在完成CeleSeAvEvEnter时释放它。否则你会泄漏内存。我使用C++绑定,理论上应该在析构函数上做CeleRaseEvter,对吗?我会跟踪并检查。
event.wait();