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

问题描述

我正在尝试编写一个函数,该函数返回最大检测到的对象的中心点。没问题问题是,如果用户要使用它,我也想从参数返回前景遮罩。

为了处理这种情况,我的解决方法如下:

    public void function2(long input) {
    long s = 0;

    for (long i = 1; i < input * input; i++){
        for(long j = 1; j < i * i; j++){
            s++;
        }
    }
} 

如果指定了cv::Point detect(const cv::Mat &img,cv::Mat &mask = *new cv::Mat()); 参数,则可以在mask中使用它。在其他情况下,RAII是否起作用?还是会发生内存泄漏?

注意:我知道我可以将函数重载2行,但是我想知道是否可以通过使用认参数而不使用指针(输入类型严格)来正确完成此功能

一个注意事项:如果可以使用main或类似功能,那完全可以。

用法示例:

cv::noArray()

解决方法

是的,这会导致内存泄漏。您可以考虑使用元组返回值:

std::tuple<cv::Point,cv::Mat> detect(const cv::Mat &img);

或将mask用作指针:

cv::Point detect(const cv::Mat &img,cv::Mat *mask = nullptr);

您也可以尝试使用演员表保留相同的签名。这很丑陋,但可能会起作用:

cv::Point detect(const cv::Mat &img,cv::Mat &mask = const_cast<cv::Mat&>(static_cast<cv::Mat const&>(cv::Mat())));
,

丑陋,但没有内存泄漏:

cv::Point detect(const cv::Mat &img,cv::Mat &mask = *std::make_unique<cv::Mat>());

如果用户不提供遮罩,则会创建一个。 detect将写回掩码,然后立即将其销毁。使用重载会更有效,因为它可以跳过不必要的更新。

或者,使用cv::Mat* mask = nullptr。我不知道您所说的“(输入类型是严格的)”是什么意思。但是对于经验丰富的C ++程序员,cv::Mat* mask = nullptr模式很明确:可选的out参数,不暗示所有权转移。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...