在我的Unicode,Visual Studio 2013项目中,我尝试使用API中的此方法:
... GOpen (GCStringIn address, GCon *g)
,其中
typedef const char * GCStringIn
//C-string input to the library. Implies null-termination.
如果我这样调用方法,GOpen会成功:
const CString connect = L"COM4 --baud 19200 --direct";
CT2A ascii(connect);
GOpen(ascii, &g);
但如果我这样打电话,GOpen就会失败:
const CString connect = L"COM4 --baud 19200 --direct";
GOpen(getCharPointer(connect), &g);
...
const char * getCharPointer(const CString &cstr)
{
CT2A ascii(cstr);
return ascii;
}
我做错了什么导致从getCharPointer方法返回的字符串无法与GOpen一起使用,我该如何修复它以便我可以在方法中进行此转换?
答案 0 :(得分:2)
var topicId,
name;
$("body").on("click", ".topic-name-edit.close", function (event) {
topicId = $('#topicId').html();
name = $(this).closest('header').find('input').val();
$(this).closest('header').html('<h1 class="blue">'+name+'</h1><span class="fake-link white-grey topic-name-edit open fa fa-pencil"></span>');
changeTopicNameService(topicId, name);
});
$("body").on("keypress", "input.topic-edit-name", function (event) {
if (event.which == 13) {
topicId = $('#topicId').html();
name = $(this).closest('header').find('input').val();
$(this).closest('header').html('<h1 class="blue">'+name+'</h1><span class="fake-link white-grey topic-name-edit open fa fa-pencil"></span>');
changeTopicNameService(topicId, name);
}
});
当你编写这样的代码时,问问自己:这个函数似乎返回一个指针。它会指向什么?此内存是静态的还是在免费商店中分配的?如果是前者,静态区域的大小是多少?如果是后者,那么它在代码中的确切位置是什么,它在哪里被释放?
如果你不能回答这些问题,你需要花更多时间在绘图板上。
const char * getCharPointer(const CString &cstr)
没有这些问题。始终使用std::string
。当您需要将std::string
向下传递给C风格的函数时,请执行以下操作:
char*
永远不要试图抓住从c_style_function(std_string_expression.c_str());
返回的char*
指针。
在这种特殊情况下,你也可以试试这个:
c_str()
如果你真的在做你发布的内容,请考虑改为
GOpen(CT2A(connect), &g);
答案 1 :(得分:2)
CT2A
是一个包含char*
的类。 CT2A
的析构函数释放了char*
指向的内存。因此,当getCharPointer()
返回时,它返回的指针指向无效的内存。您需要将ascii
指向的字符串复制到您拥有的内存中。最简单的方法可能是返回std::string
而不是原始char*
,然后您可以使用std::string::c_str()
方法将其传递给GOpen()
。