我正在进行网络编程,我看到有人使用vector作为socket的输入缓冲区而不是char数组.
我想知道这样做有什么好处.
提前致谢..
A vector<char>
本质上只是一个托管字符数组.
所以你可以写:
{
vector<char> buf(4096);
...
int result = recv(fd, &buf[received_so_far], buf.size() - received_so_far);
...
}
Run Code Online (Sandbox Code Playgroud)
向量"知道"它的大小,因此您可以buf.size()
在任何地方使用,而不必担心超出缓冲区.您还可以更改声明中的大小,并使其在任何地方生效,而不会出现任何混乱的#defines.
这种使用buf
将在堆上分配底层数组,并且当它buf
超出范围时它将自动释放它,无论这种情况如何发生(例如异常或提前返回).因此,您可以获得堆栈分配的良好语义,同时仍然可以在堆上保留大型对象.
您可以非常有效地buf.swap()
使用基础字符数组的"手持所有权" vector<char>
.(这对网络流量来说是一个好主意......现代网络很快.你要做的最后一件事就是创建你从网络收到的每个字节的另一个副本.)你仍然不必担心明确释放记忆.
对于这个特定的应用程序来说,这些都是我头脑中最大的优势.