libtorch中 torch::from_blob函数 可以把外部内存创建一个tensor,这里给个简单错误示例
torch::Tensor example()
{
std::vector<float> res_data;
res_data.resize(3 * 224* 224);
torch::Tensor res_tensor = torch::from_blob(res_data.data(),{1, 3,244, 224});
return std::move(res_tensor);
}
开始认为这个函数会拷贝一份到内存,但是这个把res_data指针传入,他内部并不会拷贝到tensor的cpu内存,只是把指针指向了这块地址,当你的res_data被析构,然后被其他地方使用,里面内容就会变化。
如果后续你不需要tensor的cpu内容,可以简单改成
return std::move(res_tensor.cuda());
就是在析构之前这里会创建一个指向gpu的tensor,并把内容拷贝到显存.
如果需要cpu做计算那就不能释放res_data,在libtorch头文件里能找到该函数的一个重载接口
using Deleter = std::function<void(void*)>;
inline at::Tensor from_blob(
void* data,
at::IntArrayRef sizes,
const Deleter& deleter,
const at::TensorOptions& options = at::TensorOptions())
这里的res_data需要在堆区new 出来,同时把析构方法作为低三个参数传入from_blob函数
Tensor在析构的时候会调用你的释放方法,释放掉这段内存.