2015-10-15 153 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; 
}