2015-10-15 114 views
1

注:API使用的char *,而不是为const char *,所以我不能使用c_str()也函数调用sendCall是Aysnchronous呼叫字符串为char *转换为非静态字符串失败

下面是我的代码,它当我使用

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")); 
    } 
} 
+4

为什么不直接使用'secondCopy.c_str()'? API是否只接受'char *'而不是'const char *'? – crashmstr

+0

我试过使用c_str(),但它返回一个const char *,下面的函数需要一个char *而不是一个const char * –

+0

不知道这是一个问题还是一个旁注,但是你的两个版本字符串(除了'3.0'和'ABC')不一样。 'currString'在值周围有引号,'desiredString'没有。 – crashmstr

回答

0

如果埃雷使用并联的sendCall功能运行:

sendCall(aSession.get(), aPayload,"SRING", true); 

aPayloadpayloadString成为和payloadString变得&currString[0];( 建议使用c_str()成员函数,该NO求解 YOU问题就在这里)所以当functionName超出范围currString变量自动调用他的析构函数和 char* payloadString = &currString[0];成为无效指针。

+0

如果使用这个char * payloadString =&currString [0];它工作正常... sendCall失败,当我尝试这样做char * payloadString =&desiredString [0];或者char * payloadString =&sendCopy [0];我不明白,因为两者都是静态字符串 –

2

即使secondCopystatic(就像curString一样),每当您拨打functionName时,都会为其分配一个本地变量。这意味着指向string对象内的char*的底层指针可能会在对该函数的两次调用之间改变。如果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; 
}