Halcon视觉之家-Halcon视觉技术论坛

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 2140|回复: 0

[资料] HALCON的HTuple和HString(C ++)的常见问题

[复制链接]

签到天数: 12 天

连续签到: 3 天

[LV.3]偶尔看看II

231

主题

1062

帖子

6836

积分

Rank: 9

积分
6836

热心会员突出贡献切换助手验证会员最佳新人

发表于 2020-2-21 12:16:21 | 显示全部楼层 |阅读模式

51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

您需要 登录 才可以下载或查看,没有账号?会员注册

x
blog-007-HTuple_HString_Bug_con.jpg
假设您具有以下HalconCpp代码以输出的字符串保存在HTuple中:
  1. #include <iostream>
  2. #include <halconcpp/HalconCpp.h>

  3. int main() {
  4.   HalconCpp::HTuple text("Hello World");
  5.   const char* s = text.S().Text();
  6.   std::cout << s << '\n';
  7.   return 0;
  8. }
复制代码

该程序在第5-7行中包含一个严重的错误,我经常看到该错误。你马上抓到吗?

继续自己发现错误:

启动VS 2015的开发人员命令提示符(这是x86构建环境)
  1. set PATH=%HALCONROOT%\bin\x86sse2-win32;%PATH%
  2. cl main.cpp /Zi /EHsc /I%HALCONROOT%/include /link halconcpp.lib /LIBPATH:"%HALCONROOT%/lib/x86sse2-win32
  3. main.exe
复制代码

输出将是一些神秘的东西ð☼▲x└,甚至崩溃。

发生了什么?
调查中
VS2015调试器抢救!使用以下命令从开发人员命令提示符启动它devenv main.cpp /debugexe main.exe
在代码行设置断点 const char* s = text.S().Text();
调试(F5)
要了解发生了什么,查看单个C ++语句的CPU实际执行的操作通常会很有帮助:

在VS2015中按ALT + 8查看汇编器输出
  1. const char* s = text.S().Text();

  2. 0131C38A  lea         eax,[ebp-24h]  
  3. 0131C38D  push        eax  
  4. 0131C38E  lea         ecx,[text]  
  5. 0131C391  call        dword ptr [__imp_HalconCpp::HTuple::S (013BD218h)]  
  6. 0131C397  mov         dword ptr [ebp-10h],eax  
  7. 0131C39A  mov         ecx,dword ptr [ebp-10h]  
  8. 0131C39D  mov         dword ptr [ebp-14h],ecx  
  9. 0131C3A0  mov         byte ptr [ebp-4],1  
  10. 0131C3A4  mov         ecx,dword ptr [ebp-14h]  
  11. 0131C3A7  call        dword ptr [__imp_HalconCpp::HString::Text (013BD224h)]  
  12. 0131C3AD  mov         dword ptr [s],eax  
  13. 0131C3B0  mov         byte ptr [ebp-4],0  
  14. 0131C3B4  lea         ecx,[ebp-24h]  
  15. 0131C3B7  call        dword ptr [__imp_HalconCpp::HString::~HString (013BD228h)]  

  16.   std::cout << s << '\n';

  17. 0131C3BD  push        0Ah  
  18. 0131C3BF  mov         edx,dword ptr [s]  
  19. 0131C3C2  push        edx
复制代码

也许你是不是在确信基于x86架构,但调用HTuple::S应该很容易看到,调用HString::Text上HString的返回HTuple::S和再调用临时的析构函数HString::~HString。从现在开始,每次对HString返回的内部数据HString::Text的访问都是对未定义内存的访问!因此,s的输出是未定义内存的输出,而不是预期的“ Hello World”的输出。

怎么修
始终立即将myTuple.S().Text()的输出分配给像std :: string这样的内存管理类,如下所示:
  1. #include <iostream>
  2. #include <string>
  3. #include <halconcpp/HalconCpp.h>

  4. int main() {
  5.   HalconCpp::HTuple text("Hello World");
  6.   //const char* s = text.S().Text(); //DO NOT USE
  7.   std::string s = text.S().Text();
  8.   std::cout << s << '\n';
  9.   return 0;
  10. }
复制代码

顺便说一句:与上面的问题类似,永远不要分配std::string的c_str()给const char*。
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

视觉培训招生

建议您使用Chrome、Firefox、Edge、360、IE10以上等主流浏览器浏览本论坛

算子查询| 申请友链| 小黑屋| 手机版| Archiver| 业务支持|

© 2015-2021 Halcon视觉之家  X3.4  粤ICP备15095995号 粤公网安备44030602000670号

本站已安全运行:

快速回复 返回顶部 返回列表