2017-02-27 94 views
1

我有下面的代码保存点云在我的GPU缓存:的OpenCL/C++ - 返回一个CL ::缓冲区对象

cl::Buffer writePointCloudToGPU(pcl::PointCloud<pcl::PointXYZ>& pointCloud){ 
    cl_int err; 
    cl::Buffer bufferCloud(getContext(), CL_MEM_READ_WRITE, sizeof(pcl::PointXYZ) * pointCloud.size(), NULL, &err); 
    getQueue().enqueueWriteBuffer(bufferCloud, CL_TRUE, 0, sizeof(pcl::PointXYZ) * pointCloud.size(), const_cast<float*> (&pointCloud.points[0].x), NULL); 
    return bufferCloud; 
} 

这是否会导致内存泄漏问题,当我返回CL ::缓冲?一旦我返回bufferCloud对象,它的程序何时释放它呢?

+0

对于1.2版,没有在析构函数,其中,被称为释放()时,例如超出范围(当您返回后拷贝构造函数的工作就被破坏了,当你把它分配给一个变量,又称为析构函数在复制构造函数调用之后,当超出范围时,调用它的析构函数)。对于2.0+版本,里面有智能指针,所以更好的用法可以在那里。也许复制elision在里面工作。 –

回答

1

<CL/cl2.hpp> OpenCL的包装器使用的OpenCL API引用计数跟踪您cl::Buffer或任何其他类型的OpenCL对象的用途,因此,虽然我不建议只是删除的cl::Buffer &cl::Buffer const&或等所有用途(因为参考总是计数是要付出代价的......)这是,从逻辑上来说,绝对安全的复制这些类型:您可以将它们看作是围绕std::shared_ptr<cl_mem>是包装或一些类似的结构,只要你明白,他们使用不是实际上std::shared_ptr

的的直接后果,据我所知,是引用计数时,不能确保在多个线程调用。但是,如果您的程序设计得当,所有对OpenCL API的调用都应该发生在一个专用线程上,所以这不应该成为问题。