我正在尝试编写一个函数,该函数返回最大检测到的对象的中心点。没问题问题是,如果用户要使用它,我也想从参数返回前景蒙版。
为了处理这种情况,我的解决方案如下:
cv::Point detect(const cv::Mat &img, cv::Mat &mask = *new cv::Mat());
如果指定了mask
参数,则可以在main
中使用它。 RAII是否可以在其他情况下工作,还是会发生内存泄漏?注意:我知道我可以将函数重载2行,但是我想知道是否可以通过使用默认参数而不使用指针(输入类型很严格)来正确执行此功能。
另一个说明:如果可以使用
cv::noArray()
或类似的函数,那完全可以。用法示例:
char ch = 0;
while (ch != 27) // ESC is pressed
{
cap >> img;
if (img.empty())
break;
cv::Mat mask;
cv::Point pt = detect(img, mask);
// or pt = detect(img);
cv::imshow("original", img);
cv::imshow("foreground", mask);
ch = cv::waitKey(1);
}
最佳答案
是的,这会导致内存泄漏。您可以考虑使用元组返回值:
std::tuple<cv::Point, cv::Mat> detect(const cv::Mat &img);
或将mask
用作指针:cv::Point detect(const cv::Mat &img, cv::Mat *mask = nullptr);
您也可以尝试使用 Actor 表保留相同的签名。这很丑陋,但可能会起作用:cv::Point detect(const cv::Mat &img, cv::Mat &mask = const_cast<cv::Mat&>(static_cast<cv::Mat const&>(cv::Mat())));
关于c++ - 用 `new`调用默认参数会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307876/