c++ - 用 `new`调用默认参数会导致内存泄漏吗?

标签 c++ memory-leaks default-parameters opencv-mat

我正在尝试编写一个函数,该函数返回最大检测到的对象的中心点。没问题问题是,如果用户要使用它,我也想从参数返回前景蒙版。
为了处理这种情况,我的解决方案如下:

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/

相关文章:

C++ std::map 在 "*"上失败?

iphone - 多次保存大型 nsstring 文件会使应用程序崩溃

memory-leaks - PHP-FPM占用太多内存

default-parameters - 具有多个子句的命名函数的 Elixir 默认参数

java - 默认 Jersey 查询参数

javascript - 为什么这个 ES6 默认参数值没有给出期望的结果?

c++ - 键盘布局方向

c++ - 在 Windows 下获取指向调用堆栈底部的指针并通过地址(如 dladdr)解析符号?

c++ - 如何在 Linux 上使用 Boost.Filesystem?

delphi - 使用控制台应用程序报告关闭时的内存泄漏