在向量中存储指向数组的共享指针
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_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();
}
您可以在没有数组符号的情况下使用 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
}
我正在尝试将指向固定大小数组的共享指针存储到向量中,我想使用共享指针,因为我必须将指向数组的指针传递给另一个 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()
.
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();
}
您可以在没有数组符号的情况下使用 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
}