你需要看你如何處理從您返回指針,例如,由於存儲在STD分配下面的代碼將無法正常工作的內存: :字符串將在fn()退出時釋放。
const char* fn(const char*psz) {
std::string s(psz);
// do something with s
return s.c_str(); //BAD
}
一種解決方案是在功能分配內存,並確保函數的調用者釋放它:
const char* fn(const char*psz) {
std::string s(psz);
// do something with s
char *ret = new char[s.size()]; //memory allocated
strcpy(ret, s.c_str());
return ret;
}
....
const char* p = fn("some text");
//do something with p
delete[] p;// release the array of chars
或者,如果你知道字符串的大小上限您可以自己在堆棧上創建它並傳入指針,例如
void fn(const char*in size_t bufsize, char* out) {
std::string s(psz);
// do something with s
strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy
}
....
const int BUFSIZE = 100;
char str[BUFSIZE];
fn("some text", BUFSIZE, str);
//ok to use str (memory gets deleted when it goes out of scope)
「將它從std :: string轉換回char *以顯示結果。」 - 爲什麼你不能顯示結果時,它是一個字符串?應該可以做std :: cout << my_string; – 2010-04-01 22:23:23
這是我必須使用的界面。所以雖然我使用字符串,只要我可以如果一個接口需要char *那麼這就是我必須使用的。函數輸出參數是一個char * ...這就是我必須使用的 – user295030 2010-04-01 22:29:06
在這種情況下,接口應該說一些關於內存管理的內容。我說「應該」,因爲它*可能*不是 - 某些接口指定得很差,生活的事實。無論何時從函數返回指針,都需要說明誰負責分配所指向的數據,它保持有效的時間以及誰負責釋放它(如果適用)。如果你能解決這個問題,你可以找出如何返回一個合適的指針值。 – 2010-04-01 22:39:17