正如其他答案所指出的,c++ 中应避免使用malloc(甚至new)。无论如何,如你所愿:
我需要在这种情况下使用malloc 而不是new / delete 的逻辑,因为我必须在cuda 中执行此操作...
在这种情况下,您必须首先为Hessian 实例分配内存,然后遍历它们并为每个Dxx、Dxy 和Dyy 分配内存。我会为此创建一个函数,如下所示:
Hessian* create(size_t length) {
Hessian* obj = (Hessian*)malloc(length * sizeof(Hessian));
for(size_t i = 0; i < length; ++i) {
obj[i].Dxx = (float*)malloc(sizeof(float));
obj[i].Dxy = (float*)malloc(sizeof(float));
obj[i].Dyy = (float*)malloc(sizeof(float));
}
return obj;
}
要释放您使用上述create 函数分配的内存,您必须遍历Hessian 实例并首先释放每个Dxx、Dxy 和Dyy,然后释放存储@987654340 的块@实例:
void destroy(Hessian* obj, size_t length) {
for(size_t i = 0; i < length; ++i) {
free(obj[i].Dxx);
free(obj[i].Dxy);
free(obj[i].Dyy);
}
free(obj);
}
注意:使用所提供的方法会将防止内存泄漏的责任转嫁给您。
如果您希望使用std::vector 而不是手动分配和释放(强烈推荐),您可以write a custom allocator 使用cudaMalloc 和cudaFree,如下所示:
template<typename T> struct cuda_allocator {
using value_type = T;
cuda_allocator() = default;
template<typename U> cuda_allocator(const cuda_allocator<U>&) {
}
T* allocate(std::size_t count) {
if(count <= max_size()) {
void* raw_ptr = nullptr;
if(cudaMalloc(&raw_ptr, count * sizeof(T)) == cudaSuccess)
return static_cast<T*>(raw_ptr);
}
throw std::bad_alloc();
}
void deallocate(T* raw_ptr, std::size_t) {
cudaFree(raw_ptr);
}
static std::size_t max_size() {
return std::numeric_limits<std::size_t>::max() / sizeof(T);
}
};
template<typename T, typename U>
inline bool operator==(const cuda_allocator<T>&, const cuda_allocator<U>&) {
return true;
}
template<typename T, typename U>
inline bool operator!=(const cuda_allocator<T>& a, const cuda_allocator<U>& b) {
return !(a == b);
}
自定义分配器的使用非常简单,只需将其指定为std::vector的第二个模板参数即可:
struct Hessian {
std::vector<float, cuda_allocator<float>> Dxx;
std::vector<float, cuda_allocator<float>> Dxy;
std::vector<float, cuda_allocator<float>> Dyy;
};
/* ... */
std::vector<Hessian, cuda_allocator<Hessian>> hessian;