我是opencv和c++的新手,我被迫精简c++以在我的delphi应用程序上使用opencv。因此,我从dll导出了此函数,以在图像处理后将要转换为mat的指针转换为字节。这是即时通讯使用的功能:

DllExport unsigned char* MatToBytes(cv::Mat *src, int &outLen)
{
    cv::Mat &matCvrt = *src;
    std::vector<unsigned char> *poutVet = new std::vector<unsigned char>();
    std::vector<unsigned char> &outVet = *poutVet;
    imencode(".png", matCvrt, outVet);
    outLen = outVet.size();
    unsigned char* outBytes;
    outBytes = new unsigned char[outVet.size()];
    std::copy(outVet.begin(), outVet.end(), outBytes);
    vector<unsigned char>().swap(outVet);
    return outBytes;
}

我已经整天研究了它,但是找不到答案。如果我删除代码
vector<unsigned char>().swap(outVet);

它可以正常工作,但会泄漏内存。如果将其放入代码中,则会收到“调试断言失败!”的消息。希望有人能帮助我,非常感谢。

最佳答案

不要使用指向std::vector的指针。此类已经管理内存分配和释放:

DllExport unsigned char* MatToBytes(cv::Mat *src, int &outLen)
{
    std::vector<unsigned char> outVet;
    imencode(".png", *src, outVet);
    outLen = outVet.size();
    unsigned char* outBytes;
    outBytes = new unsigned char[outVet.size()];
    std::copy(outVet.begin(), outVet.end(), outBytes);
    return outBytes;
}

08-24 13:54