我正在尝试将一个固定大小数组的共享指针存储到一个向量中,我想使用共享指针,因为我必须将一个指向数组的指针传递给另一个将写入数组的类,而我我希望拥有多个数组,因为我可能有更多的写入类实例,每个实例需要一个数组来写入,它们会在数组中写入大量数据,因此移动它们不是一个好的选择。
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 []>&)’
我尝试了不同的选择,但没有一个有效,你能指出正确的做法吗?还是有一种我想念的替代方案?写入类需要一个用于写入函数的字符数组,因此我认为我坚持使用数组。
谢谢!
答案 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%?}