[zz]boost::function and bind需注意的事項

服務器代碼依賴了boost的function和bind,用來作回調,異步調用時會出現這種down機.閒話少說上代碼:服務器

複製代碼
void fn(std::string str);

char *temp_str = new char[24];
strcpy(temp_str,"1212");
boost::function f
= boost::bind(fn,temp_str); f();
複製代碼

這邊的f函數對象裏面保存了一個temp_str的指針,若是是同步調用,會有臨時的std::string變量產生,產生拷貝一次temp_str,以後就不在引用temp_str,因此不會出現任何問題;異步

但是若是是異步調用,temp_str就多是野指針,若是temp_str被釋放了,從const char*構造一個std::string的過程就有可能會down掉.這也就是咱們服務器裏面一個(一批,準確的說)存在了兩年多的Bug.函數

 

雖然知道了Bug的緣由,解決辦法也會很容易有,就是本身顯式的產生一個臨時變量,讓boost拷貝過去.......post

std::string temp_string = temp_str;
boost::function f = boost::bind(fn, temp_string);

 

可是,我在想,爲啥boost當初設計的時候,這麼蛋疼,爲啥不直接保存一個函數參數簽名類型的變量,而是保存了一個bind後面的變量.畢竟bind的時候,已經推導出來函數各個參數的準確類型了.若是他直接保存一個簽名類型的變量,就不會發生這種問題.spa

 

PS:設計

boost::bind,boost::function,boost lambda在設計的時候,都是lazy的,就是惰性求值.包括C++11的lambda表達式,也有多是惰性求值.
在使用的時候須要注意.指針

相關文章
相關標籤/搜索