将共享指针存储到向量中的数组

时间:2017-04-25 10:42:15

标签: c++ arrays c++11 shared-ptr

我正在尝试将一个固定大小数组的共享指针存储到一个向量中,我想使用共享指针,因为我必须将一个指向数组的指针传递给另一个将写入数组的类,而我我希望拥有多个数组,因为我可能有更多的写入类实例,每个实例需要一个数组来写入,它们会在数组中写入大量数据,因此移动它们不是一个好的选择。

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 []>&)’

我尝试了不同的选择,但没有一个有效,你能指出正确的做法吗?还是有一种我想念的替代方案?写入类需要一个用于写入函数的字符数组,因此我认为我坚持使用数组。

谢谢!

3 个答案:

答案 0 :(得分:2)

我觉得共享所有权在这里是错误的模式。从概念上讲,如果没有其他人观察到结果,您为什么还希望您的工作人员继续在阵列上工作?

所以我让arrayVect拥有数组,并向工作者分发指向数组的指针。如果保留其中一个数组没有意义,请先停止工作,然后删除数组。

获得该行为的最简单方法是使arrayVect成为std::vector<std::unique_ptr<std::array<char, MAX_LENGTH>>>。然后,可以通过调用char[MAX_LENGTH]获取指向可传递给worker的基础arrayVect[idx].get().data()数组的指针。

通过unique_ptr的附加间接,即使向量调整大小,指向数组的指针仍然有效。

编辑:以下是一个示例,即使您的工作人员还需要指向数组的指针,它如何与unique_ptr一起使用:

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();
}

答案 1 :(得分:1)

尝试声明下面的矢量,

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

实际上,您正在错误地声明向量。请尝试检查以上更改。希望它有所帮助!

答案 2 :(得分:1)

您可以在没有数组表示法的情况下使用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 } 作为删除者。 这是一个完整的例子。

${url1%?}