繁体   English   中英

我如何在指向Mat析构函数〜Mat()的指针上调用delete

[英]How would I call delete on a pointer to a Mat destructor ~Mat()

我有此功能可以删除指向Mat的指针,建议我更新该指针以调用Mat析构函数以方便删除:

    void cv_x_Mat(void* ptr) {
        delete (Mat*)ptr;
    }

但是,这似乎没有在编译,没有发布错误,因为我认为任何人都可以看到熟悉Destructors的错误。 任何帮助表示赞赏。

    void cv_x_Mat(void* ptr) {
        Mat::~Mat() {delete ptr;};
    }

您可以使用Mat :: release()释放矩阵内存:

cv::Mat *ptr = new cv::Mat(1000, 1000, CV_8UC3);
ptr->setTo(cv::Scalar(255, 0, 0));
// some code
ptr->release(); // DON'T release manually ptr->data
delete ptr;     // this will call delete[] on ptr->data

您甚至可以省略release(),因为cv :: Mat析构函数将为您完成此操作:

cv::Mat *ptr = new cv::Mat(1000, 1000, CV_8UC3);
ptr->setTo(cv::Scalar(255, 0, 0));
// some code
delete ptr;     // this will call delete[] on ptr->data

Mat :: release是删除安全的。 如果做两次,不会造成任何不良影响。

无法发表评论,因为我缺少代表,但我是user3517736引用的同事。 我们正在研究与其他语言的OpenCV绑定,因此我们正在解决跨语言边界的内存管理这一棘手问题。

我在暗示他所做的正是marol所暗示的。 我当时假设(现在已经确认)该释放将由析构函数调用,所以他需要做的是传递一个extern“ C”函数,该函数在Mat指针上调用delete,如下所示:

extern "C" void cv_delete_Mat(Mat* self) {
    delete self;
}

并使用适当的C互操作将该对象作为对象的终结器传递给目标语言中的垃圾收集器(在user3517736的情况下为Common Lisp)。

在Haskell(我的目标)中,这意味着将指针视为ForeignPtr,并使用调用cv_Mat_delete的终结器显式构造指针。 如果有人好奇,我可以对此进行扩展。

我之所以引起混乱,是因为我试图解释使用C互操作和GC的语言可能会尝试在指针上调用free,这对于通过new初始化的对象是不正确的。 使终结器在调用free之前被称为更复杂的问题,这显然是有问题的,在这种情况下,正确的答案是显式调用析构函数,或者只是Mat :: release()。 前者显然也可以推广到其他OpenCV类型。

因此,这是适用于大多数FFI的最通用解决方案,并且可以很容易地推广到其他类型:

extern "C" void cv_delete_Mat(Mat* self) {
    self->~Mat();
}

当然,对free的(隐式)调用仍然是错误的,但是如果不尝试将FFI本身扩展为包括C ++,那么就可以做很多事情了,在这种情况下,所有这些都无济于事。

希望可以回答OP的问题以及此页上的后续措施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM