动态创建std :: vector //创建指向矢量的指针

时间:2011-08-27 18:22:34

标签: c++ stdvector

我很新,所以我很可能错过了一些关键。

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

目前我有一个名为READBUFF的结构,它包含一个byte向量。然后,READBUFF通过名为Reader的类中的私有类型进行实例化。

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

private:
READBUFF readBuffer;
}

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

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

这一切都很好,但后来我想我宁愿动态地新建矢量内联,所以我控制指针的分配管理。我将缓冲区更改为: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;
}

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

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

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

提前致谢。我发现,当我发布这篇文章时,我错过了一些基本的东西,但我感到很茫然。

2 个答案:

答案 0 :(得分:6)

在这种情况下,您不应该使用new。它会导致您必须手动管理内存,从不您应该做的事情有很多原因 1 。您说您希望使用new来管理向量的生命周期;实际上,向量的生命周期已经被管理,因为它与持有它的对象相同。因此,该向量的生命周期是Reader类实例的生命周期。

要在构造之前设置向量的大小,您必须为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 一些原因是:

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

答案 1 :(得分:2)

我认为你可能误解了在向量上调用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;
}

此程序打印矢量的最大可能大小,而不是当前大小。另一方面,size() 打印当前大小(忽略任何已保留的内容)。

相关问题