2017-10-20 48 views
0

我有這樣的代碼塊,寫成strstream。我將它轉換爲sstream如下。我不確定,但我認爲printStream->str()正在返回一個字符串對象,其中包含printStream所指向的流緩衝區中的內容的副本(臨時),然後您將調用c_str()並獲取const char *,然後投射該常量,然後將該指針返回到函數作用域之外。我認爲,因爲您從printStream->str()得到的臨時值,您將使用一個指針來釋放此函數之外的內存。我應該怎麼做?將strstream轉換爲關於c_str的流衝突()

char * FieldData::to_string() const 
{ 
    if(printStream) 
    return printStream->str(); 
    FieldData* notConst = (FieldData*) this; 
    notConst->printStream = new std::ostrstream; 
    // check heap sr60315556 
    if (notConst->printStream == NULL) 
    return NULL; 
    *(notConst->printStream) << "Invalid Field Type"; 
    *(notConst->printStream) << '\0'; 
    return printStream->str(); 
} 

char * FieldData::to_string() const 
{ 
    if(printStream) 
    return const_cast<char *>(printStream->str().c_str()); 
    FieldData* notConst = (FieldData*) this; 
    notConst->printStream = new std::ostringstream; 
    // check heap sr60315556 
    if (notConst->printStream == NULL) 
    return NULL; 
    *(notConst->printStream) << "Invalid Field Type"; 
    *(notConst->printStream) << '\0'; 
    return const_cast<char *>(printStream->str().c_str()); 
} 
+1

不要使用'new',不使用C-風格的轉換,不要使用'const_cast' *特別*修改變量,不要使用C風格的字符串,不要返回指向已經釋放的內存的指針。事實上,我相當確定,如果重新開始比修復此代碼更容易。例如 – milleniumbug

+0

我應該如何更改我的代碼?返回const_cast (printStream-> str()。c_str()); –

回答

1

更改返回類型std::string並直接返回std::string對象。

+0

我該怎麼辦?例如,我怎樣才能改變這一行 return const_cast (printStream-> str()。c_str()); –

1

我覺得一個叫to_string的功能真的,真的,真的應該會返回一個std::string

然後所有這些垃圾可以通過

更換
std::string FieldData::to_string() const 
{ return "Invalid Field Type"; }