2017-02-27 95 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的調用都應該發生在一個專用線程上,所以這不應該成爲問題。