在 tesseract、c++ 中释放 char* 时发生访问冲突

Access violation when freeing char* in tesseract, c++

使用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;

我在删除结果时遇到访问冲突。

当我使用 VS2015 时,我看到另一个 post 建议 "rebuilt tesseract in VS2015"。怎么做?

如有任何帮助,我们将不胜感激。谢谢

你确定它不应该是:

*result = api.GetUTF8Text();

如果没有星号,您会将指针重置到另一个位置(留下使用 new 运算符创建的位置)。当您稍后尝试释放它时,您会收到错误消息。

这是一种选择。否则如果应该有result没有星号,你不应该在之前用new分配内存。

简单地说,您没有删除对象的结果的所有权。我会解释为什么。

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

在第 5 行,result = api.GetUTF8Text(); 这个方法(似乎)return 一个指针,这意味着 'result' 中的 memory-address 被 over-written新指针。也许 api 提供的 internal-buffer 的位置是 0xBA2。由于您没有将它存储在其他任何地方,因此 0xF00 地址现在丢失了!

第 10 行,delete[] result; - 这告诉系统根据结果删除内存 pointed-to,在本例中,我假设的 0xBA2,内存 由 api,不是你分配的内存 - 系统检测到这个,并抛出一个适当的错误。

如果APIreturn是一个指针

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

一些有用的建议:

请注意,现代 c++(并且大多数编译器都支持)shared_ptr, unique_ptr, and others - 使用这些通常比 free/delete 好得多。

If you leave resource management to handles and containers relying on RAII, rather than littering your code with pointer, news and deletes, you don’t encounter resource leaks or write to freed memory. ~ Bjarne Stroustrup

内存泄漏是,你没有释放你 malloc'ed()

"result = " 将指针移动到其他地方,在本例中为 api 给你的地方

也许"strcpy (result, api.GetUTF8Text() )"是你想要的?

最后我使用了另一个c++包装器库并且没有内存泄漏。我的想法是内存泄漏是由原始库引起的。感谢大家的帮助。