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

标签 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;

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

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

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

最佳答案

简单地说,你没有删除对象的结果的所有权。我会解释原因。

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

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

在第 10 行,delete[] result; - 这告诉系统删除​​ result 指向的内存,在本例中,我假设的 0xBA2,内存 由 api 拥有,而不是您分配的内存 - 系统检测到这一点,并引发了相应的错误。

如果API返回一个指针

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

一些有用的建议:

注意现代 c++(和大多数编译器支持)shared_ptr, unique_ptr, and others - 通常使用这些比释放/删除要好得多。

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

关于c++ - 在 tesseract、c++ 中释放 char* 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035674/

相关文章:

c++ - 第一次异常发生在 ... : Access violation reading location . .. 使用 Visual Studio 2010 进行调试时

c++ - 关于在C++中将数据从字符串转换为 float 的查询

c++ - 这种方法是否对分支预测产生积极影响?

python - 如何使 Tesseract 更快

image-processing - Tesseract:如何一次用多种语言运行tesseract

python - 输入 "help("模块时 Windows 上的 Spyder 崩溃")"

Apache Thrift 教程中的 C++ 链接器错误 - undefined symbol

c++ - 推导用户定义值模板参数(C++2a,P0732R2)

android - 获取 Tess-Two 上的单词列表

c# - 将 byte[] 从 c# 传递到纯 c dll 时发生访问冲突