c++ - 动态创建 std::vector//创建指向 vector 的指针

标签 c++ stdvector

我是新手,所以我很可能遗漏了一些关键的东西。

我正在使用 std::vector 来存储来自 ReadFile 操作的数据。

目前我有一个名为 READBUFF 的结构,其中包含一个字节 vector 。然后通过名为 Reader 的类中的私有(private)类型实例化 READBUFF。

class Reader{
public:
void Read();
typedef struct {
std::vector<byte> buffer;
} READBUFF;

private:
READBUFF readBuffer;
}

在 Read() 中,我目前将数组的大小调整为我想要的大小,因为默认分配器会创建一个非常大的 vector [4292060576]

void Reader::Read()
{
readBuffer.buffer.resize(8192);
}

这一切都很好,但后来我开始考虑我宁愿动态地 NEW vector 内联,这样我就可以控制指针的分配管理。我将缓冲区更改为:std::vector* 缓冲区。当我尝试执行以下操作时,缓冲区未设置为新缓冲区。从调试器中可以清楚地看出它没有被初始化。

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

主要的第一个问题是为什么这不起作用?为什么不能将缓冲区指针分配给有效指针?另外,我如何定义内联分配的大小与必须调整大小?

我的最终目标是“新建”缓冲区,然后将它们存储在双端队列中。现在我这样做是为了重用上面的缓冲区,但实际上我是在将缓冲区复制到另一个新缓冲区,而我只想存储指向创建的原始缓冲区的指针。

 std::vector<byte> newBuffer(pKey->buffer);
 pKey->ptrFileReader->getBuffer()->Enqueue(newBuffer);

提前致谢。当我发布这篇文章时,我意识到我遗漏了一些基本的东西,但我不知所措。

最佳答案

在这种情况下,您不应该使用 new。它导致您必须手动管理内存,从不出于多种原因您不应该这样做1。你说你想通过使用 new 来管理 vector 的生命周期;实际上, 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

as the default allocator creates a really large vector [4292060576]

不,它没有(如果有,你的整台计算机上可能只有一个 vector ,而且你的计算机可能会崩溃)。当您添加内容并超过容量时,它会逐渐调整存储大小。不过,像您一样使用 resize 仍然很好,因为不是分配一个小的,填充它,分配一个更大的,然后复制所有内容,填充它,分配一个更大的,然后复制所有内容,等。您只需分配一次所需的大小,这样会快得多。

1 一些原因是:

  1. 您必须确保在其他人使用它之前分配它,对于普通成员变量,它会在您的对象有机会使用它之前自动完成。
  2. 您必须记住在析构函数中删除它。
  3. 如果您不执行上述 2 项操作,则可能会出现段错误或内存泄漏。

关于c++ - 动态创建 std::vector//创建指向 vector 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216443/

相关文章:

c++ - 从 Visual Studio 2017 运行 CMake 的 PACKAGE 目标

c++ - 从带有空格分隔符的文本文件中将对象读入数组

c++ - 将 RVO 对象传递给 std::vector::emplace_back

c++ - 获取元素在 std::vector 中的位置

c++ - 分段故障(核心已转储)-二维数组

c++ - 范围 For 循环帮助 : Expected initializer before ":" token

C++ 未定义对命名空间中函数的引用

c++ - 使用 for_each() 和 lambda 函数打印 C 风格数组的模板函数

c++ - 指向类对象的指针 vector

C++ : How to detect duplicates in vector<string> and print ONE copy?