2011-03-30 216 views
1

我正在寫一個C++代碼,返回一些數據,問題是:我每次從另一個文件調用它時,const char都會丟失它的值。我不知道發生了什麼事。char *丟失數據

我對ProcClient.h

代碼
virtual void reportWorkflowError(unsigned int workflow, 
     const dp::String& errorCode) { 
    char message[1000]; 
    snprintf(message, 1000, "Workflow: %s ERROR: %s", workflowToString(
      workflow).utf8(), errorCode.utf8()); 
    printf("[%s]", message); 

    errorInfo = message; 
} 
virtual const char * getErrorInfo() { 
    return errorInfo; 
} 

[工作流程:DW_FULFILL ERROR:E_ADEPT_NO_TOKEN]

[工作流程:ERROR:E_ADEPT_NOT_READY]

//被拋出兩個錯誤,和errorInfo中應該有最後的

關於Services.cpp我開始一個「工作流程」,如果它拋出一個錯誤上面的監聽器被調用,之後,我應該得到臨時lastError指針。

// g_drmClient是ProcClient

bool RMServices::startFullfilment(dp::String acsm) { 
    //Do things 
g_drmClient->getProcessor()->startWorkflows(dpdrm::DW_FULFILL); 
size_t count = g_drmClient->getProcessor()->getFulfillmentItems(); 
printf("Number of items fulfilled: %d\n", count); 

bool returnValue = !g_drmClient->hasError(); 
if (!returnValue) 
    lastError = g_drmClient->getErrorInfo()); 

printf("[%s]", lastError); 

return returnValue; 
} 

這會打印: [\æ¾°O£¯| ITE的æ¾\æ¾er項目fulfer]

發生了什麼事?

+0

提示:嘗試創建一個演示問題的最小測試用例。儘可能刪除儘可能多的代碼,並且您(和其他人)更容易發現問題。 – JesperE 2011-03-30 17:44:58

回答

8
char message[1000]; 

是駐留在棧中的局部變量,超出範圍上reportWorkflowError回報。所以,

errorInfo = message; // errorInfo is simply pointing to garbage on method return. 

做這些線路上的一些事情 -

void className::foo() 
{ 
    char stackVariable[] = "abcdef" ; 
    classVariableCharPointer = new char[ sizeof(stackVariable) + 1 ] ; 

    strcpy(classVariableCharPointer, stackVariable) ; 
} 

還記得解除分配classVariableCharPointer使用delete[]析構函數。

+0

而一個解決方案是? – 2011-03-30 17:49:14

+1

使用'std :: string'?用'new []'分配這個var(注意泄漏)?使它成爲一個實例變量?有很多選擇。 – Mat 2011-03-30 17:53:50

+0

謝謝。我通過初始化errorInfo var並在其上打印來解決問題。 errorInfo =(char *)malloc(sizeof(char)* 1000); – 2011-03-30 17:55:31

2

哎呀,你不能那樣做。

只要reportWorkflowError返回,所有局部變量都將被銷燬。這包括message,其中returnValue指向。

更好的方法將包括製作returnValue字符數組,並調用srtrcpy()將本地數據複製到成員變量。這樣,在message被銷燬後,副本仍然存在。

+0

其實,reportWorkflowError來自我的超類,我無法改變它返回的東西。 – 2011-03-30 17:48:54

+0

@Marcos:然後在派生類中的任何方法之外添加一個新成員,將數據複製到該類,並返回一個指向它的指針。無論哪種方式,您都無法設置指向數據的指針,只要方法返回,數據就會被銷燬。 – 2011-03-30 17:50:28

1

您正在將message放入堆棧。也許你想要它是static,或更好的實例變量。

+1

使它成爲一個靜態變量會導致它覆蓋該類的其他實例的值。把它變成一個類變量。 – 2011-03-30 17:54:26

+0

@Jonathan:yeh,thinko(「MOAR COFFEE!」)。固定。 – geekosaur 2011-03-30 21:01:53