char *丢失数据

时间:2011-03-30 17:40:22

标签: c++ c pointers string

我正在写一个返回一些数据的C ++代码,问题是:每次从另一个文件调用它时,我的const 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错误:E_ADEPT_NO_TOKEN]

[工作流程:错误: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;
}

这里打印: [\æ¾°¯| |æ¾\æ¾项目更充分的迭代]

发生了什么事?

3 个答案:

答案 0 :(得分: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[]

答案 1 :(得分:2)

哎呀,你做不到。

只要reportWorkflowError返回,就会销毁所有局部变量。其中包括messagereturnValue指向。

更好的方法包括使returnValue成为一个字符数组,并调用srtrcpy()将本地数据复制到成员变量中。这样,在message被销毁后,副本仍然存在。

答案 2 :(得分:1)

你将message放在堆栈上。也许你希望它是static,或者更好的实例变量。