2013-05-02 29 views
0

當使用某些庫函數(例如strftime()strcpy()MultiByteToWideChar()),其與字符陣列(而不是std::string的)之一具有2個選擇處理:字符數組大小使用特定庫函數

  • 使用固定尺寸陣列(例如char buffer[256];),這是因爲串長度限制
  • 使用new分配所需尺寸,這也是不好的當一個人想要創建一個效用函數這樣明顯不好:

    char * fun(void) 
    { 
        char * array = new char[exact_required_size]; 
        some_function(array); 
        return array; 
    } 
    

    因爲這樣的功能的用戶必須deletearray

而第二個選項甚至不是總是可能的,如果一個人不能使用有問題的功能(當一個無法預知的功能將一個字符串多久返回)之前知道確切的數組的大小/長度。

完美的方法是使用std::string,因爲它具有可變長度,並且它的析構函數負責解除分配內存,但許多庫函數不支持std::string(不管它們應該是另一個問題)。

好的,那有什麼問題?那麼 - 我應該如何使用這些功能?使用固定大小的數組或使用new並使我的函數的用戶擔心釋放內存?或者,也許實際上我沒有想到的順利解決方案?

回答

0

您可以使用std::stringdata()方法獲取指向當前包含在string對象中的具有相同字符序列的字符數組的指針。返回的字符指針指向位於內部存儲器某處的常量,不可修改的字符數組。您不必擔心釋放由此指針引用的內存,因爲string對象的析構函數會自動執行此操作。

但是至於你原來的問題:取決於你想如何工作的功能。如果你正在修改你在函數中創建的字符數組,這聽起來像你需要在堆上分配內存並返回一個指針。用戶將不得不自行釋放內存 - 有很多標準庫函數以這種方式工作。

或者,你可以強制用戶傳入字符指針作爲參數,這將確保他們已經創建了數組並且知道他們將需要自己釋放內存。該方法更常用,可能更可取。

+0

我不知道我是否理解 - 你說我可以這樣做:'std :: string buffer; strcpy(buffer.data(),「text」);'? – NPS 2013-05-02 23:35:53