我是否必须在C 接口的OPENCV C包装器中自由分配的内存

Do I have to free memory allocated by New in a Opencv C wrapper for the C++ interface

本文关键字:自由 分配 内存 包装 OPENCV 是否 接口      更新时间:2023-10-16

我正在为C OpenCV函数编写C包装器,这是我做过的

Mat* cv_create_ones(int rows, int cols, int type) {
    return new Mat(Mat::ones(rows, cols, type));
}

在大多数包装纸中,我都会通过首先致电新的新包装。我想知道我是否必须释放新的包装中的新数据,然后将其完成后的包装器中的删除...如果有这样的方法可以将DELETE纳入上述包装器,以便在函数为时自动称为自动称为完成了使用...就像每次被称为它会创建新的,被使用,然后调用删除...仅在再次访问时再次调用新调用。...不,这是行不通的,因为如果我将数据存储在新的指针将被删除,对吗?我谷歌搜索了如何做到这一点,但我什么也没找到。专业人士对此的任何建议将不胜感激。

编辑Dima Maligin

我尝试了以下和Juanchopanza的变化,但出现错误

Mat* cv_create_zeros(int rows, int cols, int type) {
    Mat m(Mat::ones(rows, cols, type)); return &m;;
}

特别是我得到

警告:返回本地变量" M"的地址

我谷歌搜索了,在这种情况下,使用malloc进行了提议,但随后需要释放...因此,如果您知道解决方法,我会很感激。我正在为Arjun comars opencv在github上添加新功能,它准备与主体合并,其添加是为C 代码自动化C包装器,因此没有C FFI的语言可以包装OPENCV C 功能。一个例子是在github https://github.com/arjuncomar/opencv/blob/master/modules/c/src/mat.cpp...i希望有人可以查看链接,这是一些是一些,这是一些,包装器和大多数人确实使用"新",没有它不会编译,并告诉我是否使用它们,我应该安排记忆以后释放...如果您可以将他的代码的意图神圣,给我建议,我会很感激...

1-您无法创建本地变量并返回引用或指针

因此:

Mat* cv_create_zeros(int rows, int cols, int type) {
    Mat m(Mat::ones(rows, cols, type)); return &m;;
}

是非法的。您将指针返回到已删除的对象。

2-您所做的任何new,都必须delete

因此,如果调用:

Mat* cv_create_ones(int rows, int cols, int type) {
    return new Mat(Mat::ones(rows, cols, type));
}

必须使用delete删除指针。由于您编写了C包装器,并且无法使用delete,因此应该添加delete_mat功能。

void delete_mat(Mat* m)
{
   delete m;
}

编辑

由于delete并不意味着要释放内存,因此也意味着调用destructor,您需要删除的每种类型删除功能虚拟Destructur。

不需要需要为每个函数添加一个delete函数使用new,您只需要每个 type

如果您有2个(或更多)功能:

Mat* cv_create_ones(...){
  return new Mat(Mat::ones(...));
}
Mat* cv_create_zeroes(...){
  return new Mat(Mat::zeroes(...));
} 

您只需要一个delete功能即可删除垫子指针:

void delete_mat(Mat* m)
{
  delete m;
}