2017-04-25 50 views
1

我想存儲一個指向一個固定大小數組的共享指針到一個向量中,我想使用一個共享指針,因爲我必須將一個指向數組的指針傳遞給另一個類,寫在數組中,我想擁有多個數組,因爲我可能有更多的寫入類實例,每個實例都需要一個數組寫入,它們會在數組中寫入大量數據,因此移動它們不是不錯的選擇。存儲向量中的數組共享指針

std::shared_ptr<char> sp(new char [MAX_LENGTH], std::default_delete<char[]>()); 
arrayVect.push_back(sp); 

矢量被定義爲類的成員,如:

std::vector< std::shared_ptr< char [ MAX_LENGTH ] > > arrayVect; 

,我發現了錯誤:

error: no matching function for call to ‘std::vector<std::shared_ptr<char [MAX_LENGTH]> >::push_back(std::shared_ptr<char []>&)’ 

我已經嘗試了不同的選擇,但他們都沒有工作,可能你指出了正確的做法嗎?或者是否有我失蹤的替代方案?寫入類需要一個用於寫入函數的字符數組,所以我認爲我被卡住了數組。

謝謝!

+2

'的std ::矢量<性病:: shared_ptr的> arrayVect;' – CinCout

+1

對子級不是被共享的指針到一個單個字符的向量?如果我想訪問如下內容: *(arrayVect.at(0))[1] 或類似的東西? –

+0

不,這不會是指向單個字符的指針。實際上,數組通常衰變爲指針。 –

回答

2

我覺得共享所有權在這裏是錯誤的模式。從概念上講,如果沒有其他人觀察結果,爲什麼要讓你的工作人員繼續工作?

所以我會讓arrayVect擁有這些數組,並將指向數組的指針交給工作人員。如果保留其中一個數組是不合理的,請先停止worker,然後再刪除該數組。

獲得該行爲的最簡單方法是使arrayVect a std::vector<std::unique_ptr<std::array<char, MAX_LENGTH>>>。然後,可以通過調用arrayVect[idx].get().data()獲得指向基本char[MAX_LENGTH]陣列的指針,您可以將其傳遞給工作人員。

通過在unique_ptr之間增加間接指針,即使矢量調整大小,指向數組的指針仍然有效。

編輯:下面是一個例子,如何能與unique_ptr加工對象物S即使你的工人也需要一個指向數組:

class Worker { 
public: 
    Worker(std::array<char, MAX_SIZE>* array) 
     : _array{array} { 
    } 

    void perform_work() { 
     function_that_requires_c_arrays(_array->data()); // maybe also a size parameter? 
    } 

private:  
    std::array<char, MAX_SIZE>* _array; 
}; 

int main() { 
    std::vector<std::unique_ptr<std::array<char, MAX_SIZE>>> arrayVect; 
    arrayVect.emplace_back(std::make_unique<std::array<char, MAX_SIZE>>())); 

    Worker w{arrayVect.back().get()}; 
    w.perform_work(); 
} 
+0

是make_unique C++ 14?我只有C++ 11 :( –

+0

@ JD.gg是的,或者你可以做'arrayVect.emplace_back(new std :: array {});'。 – Corristo

+0

謝謝!現在,使用unique_ptr的想法也比shared_ptr更有意義。 –

1

嘗試宣告矢量像下面,

std::vector<std::shared_ptr<char> > arrayVect;

其實,你被錯誤地宣告載體。請嘗試查看以上更改。希望能幫助到你!

1

您可以使用std::vector<std::shared_ptr<char>>沒有數組符號。然後,您仍然使用std::default_delete<char[]>()作爲刪除者,這一點很重要。 這裏是一個完整的例子。

#include <iostream> 
#include <vector> 
#include <memory> 

#define MAX_LENGTH 10 

int main() { 
    std::vector<std::shared_ptr<char>> arrayVect; 
    std::shared_ptr<char> sp(new char[MAX_LENGTH], std::default_delete<char[]>()); 
    arrayVect.push_back(sp); 
    arrayVect.push_back(std::shared_ptr<char>(new char[MAX_LENGTH], std::default_delete<char[]>())); 

    char q = 0; 
    for (size_t x = 0; x < arrayVect.size(); ++x) 
     for (size_t y = 0; y < MAX_LENGTH; ++y) 
      arrayVect.at(x).get()[y] = ++q; 

    for (size_t x = 0; x < arrayVect.size(); ++x) 
     for (size_t y = 0; y < MAX_LENGTH; ++y) 
      std::cout << int(arrayVect.at(x).get()[y]) << '\n'; // Int cast to print numbers, and not ASCII control characters 
}