这是很常见的情况:
int checkSomething() {
char *buff = new char[SOMTHING_SIZE];
int ret = 0;
fillSomething(buff);
/// Check data in buff and set ret value.
...
///
delete [] buff;
return ret;
}
我认为使用vector会更安全(对开发者来说):
int checkSomething() {
std::vector<char> buff(SOMETHING_SIZE);
int ret = 0;
fillSomething(&buff[0]);
/// Check data in buff and set ret value.
...
///
return ret;
}
在呼叫删除之前从函数返回时防止出现这种情况。
问题:矢量使用的缺点是什么?我看到很多代码都使用new
/ delete
,因此很容易使用std::vector
。
答案 0 :(得分:4)
矢量使用的缺点是什么?我看到了许多带有new / delete的代码,其中很容易使用vector。
使用std::vector<char>
实际上并没有缺点。
我认为使用vector会更安全(对开发者来说)。
你是对的。它只是用原始数组指针来替代它,并且根据维护大小和重新分配,至少任何适当的实现都需要与std::vector
实现已经做的相同(这可能很难)避免所有潜伏的陷阱)。
在自定义实现中很容易出现new[]
delete[]
错误,但std::vector
难以理解,这就是它从一开始就存在的原因C ++标准定义。
使用当前标准并假设SOMETHING_SIZE
是常量值std::array
应该是首选,如果缓冲区应该在堆栈上静态分配并且适合那里。
答案 1 :(得分:2)
这里的区别在于std::vector
将释放其元素占用的内存,而你必须手动delete
动态分配的数组,你碰巧做错了 - 应该有{ {1}}代替delete []
,因为它是您要解除分配的数组。
不要忘记释放,以防你的函数提前返回/抛出异常可能会很痛苦。我们有RAII。
事实上,如果delete
在编译时已知,std::array
也将为您提供(可能更小的二进制)。
答案 2 :(得分:1)
我认为使用vector会更安全(对开发者来说)。
你是对的。
矢量使用的缺点是什么?
没有。
我看到很多带有new / delete的代码,其中很容易使用vector。
是的,世界上有很多可怕的代码。
答案 3 :(得分:1)
我想指出中间解决方案,它更像原始new[]
... delete[]
但是安全(不要求你记住解除分配) ,在有例外的情况下不会泄漏。)
那是:
std::unique_ptr<char[]> buff{new char[SOMETHING_SIZE]};
或
auto buff = std::make_unique<char[]>(SOMETHING_SIZE);
它具有在运行时选择的大小(与std::array
不同)。
不允许调整大小或复制。如果你想要那些,你应该向上移动到std::vector
。但有时候你并不想要它们,std::unique_ptr<T[]>
可以节省std::vector
所需的额外开销,以便跟踪不同的大小。
请注意,这些是在C ++ 11(和C ++ 14,make_unique
)中标准化的,但也可以在C ++ 03中构建。