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 时。怎么做?
任何帮助将不胜感激。谢谢。
简而言之,您没有删除对象的结果所有权。我会解释为什么。
在第 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