2012-02-23 26 views
1

我正在尋找一種乾淨的方式來管理數組使用C++ 11中引入的新指針模板的範圍,這裏的典型場景是當調用win32 API函數。什麼是簡單的範圍管理在C + +中的數組的簡潔範圍11

我在這裏發帖,因爲雖然有很多關於更復雜的事情的討論,但這個相對簡單的方案似乎沒有討論過,我想知道是否有比我現在開始做的更好的選擇。

#include <memory> 

void Win32ApiFunction(void* arr, int*size) 
{ 
    if(arr==NULL) 
     *size = 10; 
    else 
    { 
     memset(arr,'x',10); 
     ((char*)arr)[9]='\0'; 
    } 
} 

void main(void) 
{ 
    // common to old and new 
    int size; 
    Win32ApiFunction(NULL,&size); 

    // old style - till now I have done this for scope reasons 
    if(char* data = new char[size]) 
    { 
     Win32ApiFunction(data,&size); 
     // other processing 
     delete [] data; 
    } 

    // new style - note additional braces to approximate 
    // the previous scope - is there a better equivalent to the above? 
    { 
     std::unique_ptr<char[]> data1(new char[size]); 
     if(data1) 
     { 
      Win32ApiFunction(data1.get(),&size); 
      // other processing 
     } 
    } 
} 
+5

無論哪種情況,new都會在分配失敗時拋出異常,而不會返回0. – karunski 2012-02-23 12:14:39

+1

對於大多數真正的Win32 API函數,您需要在第一次調用之前將「size」初始化爲0。 – user9876 2012-02-23 12:24:05

+1

如果您需要在第二次調用之前將數組初始化爲零,那麼'std :: vector '是優越的(因爲它會自動且快速地進行)。如果你不需要對數組進行歸零,你所擁有的優於'std :: vector ',因爲它不會花費循環進行不必要的零初始化。如果你不處於要求最高性能的環境中,那麼使用哪個並不重要。 – 2012-02-23 13:35:38

回答

11

最乾淨的方式是使用std::vector,即使C++ 98個保證,它是用C語言風格的陣列(即,其被存儲爲單個連續塊)兼容,你需要的是通過指針第一個元素到您的Win32ApiFunction

std::vector<char> data(size); 
Win32ApiFunction(&data[0], &size); 

在C++ 11有一個特殊的成員函數std::vector<T>::data()它返回的指針數組的開始(這樣就不必理會爲矢量值類型,並使用重載std::addressofoperator&(),見How can I reliably get an object's address when operator& is overloaded?用於C++ 98與operator&()重載問題)。

+1

我想你想在這裏std :: vector 。 – karunski 2012-02-23 12:15:47

+0

@ karunski,當然,謝謝。 – Begemoth 2012-02-23 12:17:18

+1

請注意,在C++ 11中有一個特殊的方法:['std :: vector :: data'](http://en.cppreference.com/w/cpp/container/vector/data),它將返回指向數組的開始的指針。 – Xeo 2012-03-01 23:22:36