我是新人,所以我很可能错过了一些关键.
我正在使用std :: vector来存储来自ReadFile操作的数据.
目前我有一个名为READBUFF的结构,它包含一个byte向量.然后,READBUFF通过名为Reader的类中的私有类型进行实例化.
class Reader{
public:
void Read();
typedef struct {
std::vector<byte> buffer;
} READBUFF;
private:
READBUFF readBuffer;
}
Run Code Online (Sandbox Code Playgroud)
在Read()中,我当前将数组的大小调整为我想要的大小,因为默认分配器创建了一个非常大的向量[4292060576]
void Reader::Read()
{
readBuffer.buffer.resize(8192);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但后来我想我宁愿动态新建矢量内联,所以我控制指针的分配管理.我将缓冲区更改为:std :: vector*buffer.当我尝试执行以下操作时,未将缓冲区设置为新缓冲区.从调试器中可以清楚地看出它没有被初始化.
void Reader::Read()
{
key.buffer = new std::vector<byte>(bufferSize);
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了,但这与上面的行为相同.
void Reader::Read()
{
std::vector<byte> *pvector = new std::vector<byte>(8192);
key.buffer = pvector;
}
Run Code Online (Sandbox Code Playgroud)
主要的第一个问题是为什么这不起作用?为什么我不能将缓冲区指针分配给有效指针?另外,我如何定义内联分配的大小与必须调整大小?
我的最终目标是"新建"缓冲区,然后将它们存储在双端队列中.现在我这样做是为了重用上面的缓冲区,但我本质上是将缓冲区复制到另一个新的缓冲区,当我想要的是存储一个指向创建的原始缓冲区的指针.
std::vector<byte> newBuffer(pKey->buffer);
pKey->ptrFileReader->getBuffer()->Enqueue(newBuffer);
Run Code Online (Sandbox Code Playgroud)
提前致谢.我发现,当我发布这篇文章时,我错过了一些基本但我不知所措.
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
Run Code Online (Sandbox Code Playgroud)
并在Reader构造函数中使用初始化列表:
// inside the Reader class
Reader() : readBuffer(8092) { }
Run Code Online (Sandbox Code Playgroud)
这将把readBuffer.buffer大小设置为8092.
如果你真的想new用于学习:
key.buffer = new std::vector<byte>(bufferSize);
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但你不应该在Read函数中执行它,你应该在对象的构造函数中执行它.这样任何成员函数都可以使用它而无需检查它是否正确NULL.
因为默认分配器创建一个非常大的向量[4292060576]
不,它没有(如果确实如此,你可以在整个计算机上有一个向量,可能你的计算机会崩溃).当您添加内容并超出容量时,它会逐步调整存储大小.使用resize就像你正在做的那样仍然很好,因为不是分配一个小的,填充它,分配一个更大的一个并复制一切,填充它,分配一个更大的一个并复制一切,等等你只是分配大小你需要一次,这要快得多.
1一些原因是:
delete在析构函数中记住它.| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |