微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用`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参数,不暗示所有权转移。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?