动态创建std::vector //创建指向vector的指针
Dynamically creating std::vector // creating a pointer to a vector
我是新来的,所以我很可能错过了一些关键的东西。
我使用std::vector来存储ReadFile操作的数据。
目前,我有一个名为READBUFF的结构体,它包含一个字节向量。然后通过Reader类中的私有类型实例化READBUFF。
class Reader{
public:
void Read();
typedef struct {
std::vector<byte> buffer;
} READBUFF;
private:
READBUFF readBuffer;
}
在Read()中,我当前将数组大小调整为我想要的大小,因为默认分配器创建了一个非常大的向量[4292060576]
void Reader::Read()
{
readBuffer.buffer.resize(8192);
}
这一切都工作得很好,但后来我想到我宁愿动态NEW向量内联,所以我控制指针的分配管理。我把buffer改为:std::vector* buffer。当我尝试做下面的缓冲区时,没有设置为新的缓冲区。从调试器可以清楚地看出,它没有初始化。
void Reader::Read()
{
key.buffer = new std::vector<byte>(bufferSize);
}
然后我尝试了一下,但是它的行为和上面一样。
void Reader::Read()
{
std::vector<byte> *pvector = new std::vector<byte>(8192);
key.buffer = pvector;
}
第一个主要问题是为什么这不起作用?为什么我不能分配缓冲区指针有效指针?另外,我如何定义内联分配的大小,而不是必须调整大小?
我的最终目标是"新建"缓冲区,然后将它们存储在deque中。现在我这样做是为了重用上面的缓冲区,但是当我想要存储指向原始缓冲区的指针时,我实际上是将缓冲区复制到另一个新缓冲区中。
std::vector<byte> newBuffer(pKey->buffer);
pKey->ptrFileReader->getBuffer()->Enqueue(newBuffer);
提前感谢。当我发这篇文章的时候,我意识到我错过了一些基本的东西,但是我很失落。
在这种情况下不应该使用new
。它导致您必须手动管理内存,这是永远不您应该做的事情,因为有很多原因1。你说你想通过使用new
来管理矢量的寿命;实际上,vector的生命周期是已经管理的,因为它与保存它的对象相同。因此,该vector的生命周期就是Reader类实例的生命周期。
要在构造vector之前设置vector的大小,必须为READBUFF
创建一个构造函数:
// inside the READBUFF struct (assuming you're using a normal variable, not a pointer)
READBUFF() { } // default constructor
READBUFF(int size) : buffer(size) { } // immediately sets buffer's size to the argument
并在Reader
的构造函数中使用初始化列表:
// inside the Reader class
Reader() : readBuffer(8092) { }
将readBuffer.buffer
的大小设置为8092。
如果你真的想使用new
只是为了学习:
key.buffer = new std::vector<byte>(bufferSize);
这将工作得很好,但你不应该在Read
函数中这样做,你应该在对象的构造函数中这样做。这样,任何成员函数都可以使用它,而不必检查它是否为NULL
。
作为默认分配器创建了一个非常大的向量[4292060576]
不,它没有(如果它有,你可能在你的整个计算机上有一个向量,你的计算机可能会崩溃)。当您添加内容并超出容量时,它会逐渐调整存储大小。像你这样使用resize
仍然是好的,因为不是分配一个小的,填充它,分配一个大的,复制所有的东西,填充它,分配一个大的,复制所有的东西,等等,你只是分配一次你需要的大小,这要快得多。
1一些原因是:
- 你必须确保在其他人使用它之前分配它,在你的对象有机会使用它之前,普通成员变量会自动完成。 你必须记住在析构函数中
- 如果你不做以上两件事,你有一个段错误或内存泄漏。
delete
它。我想你可能误解了在向量上调用max_size()
的结果:
#include <vector>
#include <iostream>
int main() {
std::cout << std::vector<char>().max_size() << std::endl;
std::cout << std::vector<char>::size_type(~0) << std::endl;
}
程序输出vector对象的最大可能大小,而不是当前大小。另一方面,size()
将打印当前大小(忽略任何保留的内容)。
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 从函数为 std::vector 创建自定义扩展
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 从函数应用程序创建 std::vector
- 从 std::vector 创建 OpenCV 垫子的有效方法
- 如何创建一个继承自 std::vector 的类
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 使用 ::std::vector 创建数组
- C++ - 为 std::vector 创建新的构造函数<double>?
- 使用boost::mpl::vector创建可变模板
- 从std::vector创建tensorflow::张量的最有效方法
- 动态创建std::vector //创建指向vector的指针
- 如何访问使用vector创建的对象的元素