如何解决用`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 举报,一经查实,本站将立刻删除。