We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
In the TNN inference code of RVM,在第181行的 transform 函数中,定义了一个局部的cv::Mat对象 canvas,并在第191行把它的 data 作为 std::make_shared<tnn::Mat>() 的参数。
transform
cv::Mat
canvas
data
std::make_shared<tnn::Mat>()
canvas 是一个局部对象,但是 src_mat 指向的 tnn::Mat 对象,其中的 data_ 成员指向了 canvas.data。如果 cv::Mat 的底层不是使用智能指针实现(我猜想应该不是),那么当 transform 函数结束,canvas.data 处的内存将被释放,此时 src_mat 指向的对象中的 data_ 成员将指向一块非法内存。
src_mat
tnn::Mat
data_
canvas.data
在第201行的 detect 函数中,第209行调用了 transform 函数,并且在 216 行使用了 src_mat ,此时可能将访问非法内存,出现访问冲突的错误(在我的Windows电脑上,它确实出现了)。 不过值得一提的是,如果第 209 行的 transform 函数被编译器优化为 inline function ,使用 src_mat 时 canvas 还未被销毁。我想这可能是为什么在 MacOS 上没有出现错误的原因。
detect
216
The text was updated successfully, but these errors were encountered:
我先看看,你说的有一定的道理。cv::Mat底层有一个引用计数的机制,但是resize会导致一个新的cv::Mat,它并不是引用传进来的原始Mat; 另外就是,tnn::Mat通过指针赋值的方式,似乎并不是deepcopy,这么说,emmm,rvm的tnn版本里的处理,确实可能有坑... 感谢提醒
以下是tnn::Mat通过指针赋值的代码,no-deepcopy
Mat::Mat(DeviceType device_type, MatType mat_type, DimsVector dims, void* data) { dims_ = dims; data_alloc_ = nullptr; device_type_ = device_type; mat_type_ = mat_type; data_ = data; }
Sorry, something went wrong.
fix(RVM): fixed the TNN preprocess for RVM (#240)
ff33e55
0989025
641e56b
Merge pull request #241 from DefTruth/dev
54a4369
fix(TNN): fixed potential memory leak in win10 (#240)
17c9eb5
DefTruth
No branches or pull requests
In the TNN inference code of RVM,在第181行的
transform
函数中,定义了一个局部的cv::Mat
对象canvas
,并在第191行把它的data
作为std::make_shared<tnn::Mat>()
的参数。canvas
是一个局部对象,但是src_mat
指向的tnn::Mat
对象,其中的data_
成员指向了canvas.data
。如果cv::Mat
的底层不是使用智能指针实现(我猜想应该不是),那么当transform
函数结束,canvas.data
处的内存将被释放,此时src_mat
指向的对象中的data_
成员将指向一块非法内存。在第201行的
detect
函数中,第209行调用了transform
函数,并且在216
行使用了src_mat
,此时可能将访问非法内存,出现访问冲突的错误(在我的Windows电脑上,它确实出现了)。不过值得一提的是,如果第 209 行的
transform
函数被编译器优化为 inline function ,使用src_mat
时canvas
还未被销毁。我想这可能是为什么在 MacOS 上没有出现错误的原因。The text was updated successfully, but these errors were encountered: