使用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中重建tesseract”,当我使用VS2015时。怎么做?
任何帮助将不胜感激。感谢。
答案 0 :(得分:4)
简单地说,您没有结果的所有权来删除对象。我将解释原因。
在第4行,char* result = new char[100];
这将分配100个字节的内存,并将该位置存储在结果指针中。假设此内存地址恰好为0xF00。
在第5行,result = api.GetUTF8Text();
此方法(似乎)返回一个指针,这意味着&#39;结果中的内存地址&#39;正被新指针覆盖。也许api提供的内部缓冲区的位置是0xBA2。由于您还没有将其存储在其他地方,因此0xF00地址现已丢失!
第十行,delete[] result;
- 这告诉系统删除结果所指向的内存,在这种情况下,我的假设0xBA2,内存由api拥有,而不是你分配的内存< / strong> - 系统检测到此情况,并提出了相应的错误。
如果API返回指针
在这种情况下,您可以使用char * result = api.GetUTF8Text()
替换第4行和第5行。并完全删除delete语句。
一些有用的建议:
请注意,现代c ++(以及大多数编译器支持)shared_ptr, unique_ptr, and others - 使用它们通常要好得多,而不是免费/删除。
如果将资源管理留给依赖RAII的句柄和容器,而不是使用指针,新闻和删除乱丢代码,则不会遇到资源泄漏或写入释放的内存。 〜Bjarne Stroustrup
答案 1 :(得分:1)
最后我使用另一个c ++包装器库,没有内存泄漏。我的想法是内存泄漏是由原始库引起的。感谢每一个人的帮助。
答案 2 :(得分:0)
你确定它不应该是:
*result = api.GetUTF8Text();
如果没有星号,您将指针重置为另一个位置(留下使用 new 运算符创建的指针)。当您稍后尝试释放它时,您会收到错误。
这是一个选择。否则,如果结果没有星号,则不应该在之前使用 new 分配内存。
答案 3 :(得分:0)
内存泄漏是,你没有释放你的malloc'ed()
“result =”将指针移动到其他地方,在这种情况下是api给你的
或许“strcpy(结果,api.GetUTF8Text())”是你想要的?