2017-04-25 70 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 
}