签到天数: 12 天 连续签到: 3 天 [LV.3]偶尔看看II


- 积分
- 6836
   
|
51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!
您需要 登录 才可以下载或查看,没有账号?会员注册
x
假设您具有以下HalconCpp代码以输出的字符串保存在HTuple中:
- #include <iostream>
- #include <halconcpp/HalconCpp.h>
-
- int main() {
- HalconCpp::HTuple text("Hello World");
- const char* s = text.S().Text();
- std::cout << s << '\n';
- return 0;
- }
复制代码
该程序在第5-7行中包含一个严重的错误,我经常看到该错误。你马上抓到吗?
继续自己发现错误:
启动VS 2015的开发人员命令提示符(这是x86构建环境)
- set PATH=%HALCONROOT%\bin\x86sse2-win32;%PATH%
- cl main.cpp /Zi /EHsc /I%HALCONROOT%/include /link halconcpp.lib /LIBPATH:"%HALCONROOT%/lib/x86sse2-win32
- main.exe
复制代码
输出将是一些神秘的东西ð☼▲x└,甚至崩溃。
发生了什么?
调查中
VS2015调试器抢救!使用以下命令从开发人员命令提示符启动它devenv main.cpp /debugexe main.exe
在代码行设置断点 const char* s = text.S().Text();
调试(F5)
要了解发生了什么,查看单个C ++语句的CPU实际执行的操作通常会很有帮助:
在VS2015中按ALT + 8查看汇编器输出
- const char* s = text.S().Text();
-
- 0131C38A lea eax,[ebp-24h]
- 0131C38D push eax
- 0131C38E lea ecx,[text]
- 0131C391 call dword ptr [__imp_HalconCpp::HTuple::S (013BD218h)]
- 0131C397 mov dword ptr [ebp-10h],eax
- 0131C39A mov ecx,dword ptr [ebp-10h]
- 0131C39D mov dword ptr [ebp-14h],ecx
- 0131C3A0 mov byte ptr [ebp-4],1
- 0131C3A4 mov ecx,dword ptr [ebp-14h]
- 0131C3A7 call dword ptr [__imp_HalconCpp::HString::Text (013BD224h)]
- 0131C3AD mov dword ptr [s],eax
- 0131C3B0 mov byte ptr [ebp-4],0
- 0131C3B4 lea ecx,[ebp-24h]
- 0131C3B7 call dword ptr [__imp_HalconCpp::HString::~HString (013BD228h)]
-
- std::cout << s << '\n';
-
- 0131C3BD push 0Ah
- 0131C3BF mov edx,dword ptr [s]
- 0131C3C2 push edx
复制代码
也许你是不是在确信基于x86架构,但调用HTuple::S应该很容易看到,调用HString::Text上HString的返回HTuple::S和再调用临时的析构函数HString::~HString。从现在开始,每次对HString返回的内部数据HString::Text的访问都是对未定义内存的访问!因此,s的输出是未定义内存的输出,而不是预期的“ Hello World”的输出。
怎么修
始终立即将myTuple.S().Text()的输出分配给像std :: string这样的内存管理类,如下所示:
- #include <iostream>
- #include <string>
- #include <halconcpp/HalconCpp.h>
-
- int main() {
- HalconCpp::HTuple text("Hello World");
- //const char* s = text.S().Text(); //DO NOT USE
- std::string s = text.S().Text();
- std::cout << s << '\n';
- return 0;
- }
复制代码
顺便说一句:与上面的问题类似,永远不要分配std::string的c_str()给const char*。 |
|