注意:API使用char *而不是const char *所以我不能使用c_str()函数调用sendCall是一个Aysnchronous调用
以下是我的代码,当我使用
时它可以正常工作char* payloadString = >&currString[0];
然而,当我尝试使用
时char* payloadString = &secondCopy[0];
失败了,我无法理解原因。我想在下面的代码中创建一个动态可更新的字符串,如desiredString,它接受版本变量并将其分配给静态字符串secondCopy,并且能够使用它而不是currString但我想我通过使用修改后的运算符地址犯了一些错误静态字符串。请建议一个解决方法。
void functionName()
{
std::string version;
version = "ABC";
static std::string currString= "<Version=\"3.0\" Ret=\"false\"/>";
std::string desiredstring= "<Version="+version+" Ret=\"false\"/>";
static std::string secondCopy = desiredstring;
char* payloadString = &currString[0];
//char* payloadString = &secondCopy[0];
XDSC::Definition aDefinition("sname", "sid");
try
{
std::auto_ptr<otf::ClientSession> aSession;
aSession = getResources()->getManager().getSession("XML");
aSession->setAttachedToServerConversation(true);
aSession->setLogicalName("xyz");
aSession->setITOReturnPackage("svrc");
boost::shared_ptr<Payload> aPayload = boost::make_shared<Payload>(aDefinition, "3.0",payloadString, strlen(payloadString));
sendCall(aSession.get(), aPayload,"SRING", true);
}
catch(std::exception& e)
{
throw (exception(ERROR,"SendCall Failed to Send"));
}
}
答案 0 :(得分:2)
即使secondCopy
为static
(就像curString
),每次调用functionName
时都会为其分配一个局部变量。这意味着char*
对象中string
的基础指针可能会在对函数的两次调用之间发生变化。如果sendCall
函数是异步的,或者如果将指针保存在某处以供以后使用,如果再次调用该函数,则可能会发现它无效。
示例:
char* foo(string s)
{
static string ss = "aaa";
ss = s; //assignment operator, the char* inside the string class may be reallocated
char* pointer = &ss[0];
return pointer;
}
void main()
{
string s1 = "a";
char* p1 = foo(s1); //p1 is OK for now
string s2 = "b";
char p2* = foo(s2); //p1 is probably NOT OK
return 0;
}
答案 1 :(得分:0)
如果您正在并行运行sendCall
功能:
sendCall(aSession.get(), aPayload,"SRING", true);
aPayload
来自payloadString
,payloadString
成为。{
来自&currString[0];
(建议使用c_str()
成员函数,此处无法解决
你在这里遇到问题)所以当functionName
超出范围时,currString
变量会自动调用他的析构函数
char* payloadString = &currString[0];
成为无效指针。