在tesseract,c ++中释放char *时的访问冲突

aht*_*san 1 c++ tesseract access-violation

使用tesseract ocr,这是我的代码部分:

        Pix *pix = pixRead("mylocation/my.jpg");

        api.SetImage(pix);
        char* result = new char[100];
        result = api.GetUTF8Text();
        new1 = atof(result);

        cout << "result: " << new1 << endl;

        delete[] result;
Run Code Online (Sandbox Code Playgroud)

删除结果时出现访问冲突。

我看到另一篇文章建议“在 VS2015 中重建 tesseract”,当我使用 VS2015 时。怎么做?

任何帮助将不胜感激。谢谢。

Joh*_*man 5

简而言之,您没有删除对象的结果所有权。我会解释为什么。

在第 4 行,char* result = new char[100];这将分配 100 字节的内存,并将该位置存储在结果指针中。假设这个内存地址恰好是 0xF00。

在第 5 行,result = api.GetUTF8Text();此方法(似乎)返回一个指针,这意味着“结果”中的内存地址正在被新指针覆盖。也许api提供的内部缓冲区的位置是0xBA2。由于您没有将其存储在其他任何地方,因此 0xF00 地址现在丢失了!

在第 10 行,delete[] result;- 这告诉系统删除​​ result 指向的内存,在这种情况下,我假设的 0xBA2,api 拥有的内存,而不是您分配的内存- 系统检测到这一点,并抛出了适当的错误。

如果 API 返回一个指针

在这种情况下,您可以将第 4 行和第 5 行替换为char * result = api.GetUTF8Text()。并完全删除删除语句。

一些有用的建议:

请注意,现代 C++(和大多数编译器都支持)shared_ptr、unique_ptr 和其他- 通常使用这些比 free/delete 好得多。

如果您将资源管理留给依赖于 RAII 的句柄和容器,而不是用指针、新闻和删除乱扔代码,您就不会遇到资源泄漏或写入释放的内存。~ Bjarne Stroustrup