非静态字符串的字符串到char *转换失败

时间:2015-10-15 13:15:55

标签: c++ string

注意: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"));
    }
}

2 个答案:

答案 0 :(得分:2)

即使secondCopystatic(就像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来自payloadStringpayloadString成为。{ 来自&currString[0];(建议使用c_str()成员函数,此处无法解决 你在这里遇到问题)所以当functionName超出范围时,currString变量会自动调用他的析构函数 char* payloadString = &currString[0];成为无效指针。