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

Store shared pointer to array in vector

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

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

矢量被定义为 class 成员,例如:

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

我尝试了不同的替代方法,但其中 none 行得通,您能指出正确的方法吗?还是我缺少其他选择?写作 class 需要一个字符数组用于写入函数,所以我想我被数组困住了。

谢谢!

尝试像下面这样声明向量,

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

实际上,您错误地声明了 vector。请尝试检查以上更改。希望对您有所帮助!

我觉得共享所有权是错误的模式。从概念上讲,如果没有其他人再观察结果,您为什么要让您的工作人员继续在数组上工作?

所以我会让 arrayVect 拥有数组并将指向数组的指针分发给工作人员。当保留其中一个数组没有意义时,请先停止 worker,然后删除该数组。

获得该行为的最简单方法是将 arrayVect 设为 std::vector<std::unique_ptr<std::array<char, MAX_LENGTH>>>。然后可以通过调用 arrayVect[idx].get().data().

获得指向可以传递给 worker 的底层 char[MAX_LENGTH] 数组的指针

通过 unique_ptr 进行额外的间接寻址,即使调整了向量的大小,指向数组的指针仍然有效。

编辑:这是一个如何使用 unique_ptrs 的示例,即使您的工作人员也需要指向数组的指针:

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

您可以在没有数组符号的情况下使用 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
}