【发布时间】:2021-01-26 04:16:15
【问题描述】:
我正在尝试编写一个返回最大检测对象中心点的函数。这里没问题。问题是,如果用户想使用它,我还想从参数中返回前景掩码。
为了处理这种情况,我的解决方案如下:
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);
}
【问题讨论】:
-
不可能说。代码可以删除底层指针,在这种情况下没有泄漏。但这很糟糕。不要这样做。
-
RAII 是一种您必须实现的设计模式,它不是 C++ 免费强制执行的。我假设如果用户传递了
mask的值,您不会删除detect末尾的cv::Mat,这意味着您确实会有内存泄漏。只需拿一个指针并使用cv::Mat* p_Mask = nullptr或其他东西,如果您希望他们能够在没有掩码的情况下调用它。 -
内存泄漏不是你通过new创建东西的地方,而是你错过删除它的地方。
-
x = *new X几乎永远不会正确,不要那样做。 -
@Burak VC++ 有一个允许它的非标准和不可移植的扩展。
标签: c++ memory-leaks default-parameters opencv-mat