2016-02-25 83 views
0

Valgrind是給我一個無效的讀取錯誤:爲什麼Valgrind會給出「無效的大小爲1的讀取」錯誤?

==37561== Invalid read of size 1 
==37561== at 0x7E81: strlen (vg_replace_strmem.c:427) 

一類中的以下代碼(我認爲可能與尾\0,但我不知道)。

std::queue<std::string> errorLog; ///< FIFO used to store errors 

const char *Monitor::popErrorFromErrorLog() { 
    if (!errorLog.empty()) { 
     std::string str = errorLog.front(); 
     errorLog.pop(); 
     return str.c_str(); 
    } else { 
     return nullptr; 
    } 
} 

void Monitor::reportError(std::string s) { 
    std::ostringstream err; 
    err << "Error reported: " << s << std::endl; 
    errorLog.push(err.str()); 
} 

任何想法這裏有什麼問題嗎?

回答

3

您在返回c_str終場前的std::string不再存在:你的流行從堆棧和它的內容複製到一個局部變量,那麼你就返回一個局部變量,它也被打爛作爲的c_str指針函數返回。

至於解決方案,爲什麼不只是返回std::string,而不是訴諸C字符串?

+0

謝謝 - 需要一個返回指針的方法(如果沒有錯誤,它將爲null),但是已經修改了一個std :: string並檢查empty()。 – John

1

std::string str = errorLog.front();創建本地std::string。當您使用return str.c_str();時,您將返回一個指向std::string包裝的C字符串的指針。一旦返回發生,字符串被銷燬,現在你已經返回了一個指向超出範圍的內存的指針。

我只想返回std::string,所以您不必擔心這一點。如果你不能這樣做,那麼你將不得不動態分配存儲空間(新的{}),然後你必須記住清理完成(delete[])。

相關問題