我是否应始终在功能末尾调用vector clear()
Should I always call vector clear() at the end of the function?
我有一些简单的功能,它使用这样的向量(伪代码):
void someFunc(void) {
std::vector<std::string> contentVector;
// here are some operations on the vector
// should I call the clear() here or this could be ommited ?
contentVector.clear();
}
我应该调用clear()还是可以使用?
如果我们查看std :: vector :: vector :: 〜vector的cppreference.com,则说:
破坏容器。调用了元素的破坏者,并处理了使用的存储。请注意,如果元素是指示器,则尖头对象不会被破坏。
所以不,您不必致电清晰。
如果我们想遵守标准草案,我们必须查看23.2.1
一般容器要求段 4 ,它说:
在表96和97中,x表示包含T型对象的容器类,A和B表示X型的值,[...]
,然后查看具有以下表达式输入的Table 96 — Container requirements
:
(&a)->~X()
和以下注:
注意:驱动器应用于a的每个元素;所有内存都被划分了。
更新
这是行动中的raii,如 bjarne stroustrup 在为什么C 不提供"最后"构造?:
因为C 支持几乎总是更好的替代方案:"资源获取为初始化"技术(TC PL3第14.4节)。基本思想是由本地对象表示资源,以便本地对象的驱动器将发布资源。这样,程序员就不会忘记发布资源。
绝对没有必要。std::vector
和所有其他容器自动将其元素自动摧毁,当它们自己被摧毁时。这意味着他们的破坏者对该行动负责。所以,不要。
这样的美是,容器自然是例外安全 [1] :
void someFunc(void) {
std::vector<std::string> contentVector;
// here are some operations on the vector
throw std::runtime_error("I just want to throw!");
contentVector.clear();
}
行contentVector.clear();
会被调用吗?不,但是您仍然安全,因为可以保证contentVector
的攻击器被称为。
vector [2] :
破坏容器。调用了元素的破坏者,并处理了使用的存储。请注意,如果元素是指示器,则尖头对象不会被破坏。
[1]
[2] 有关SGI STL DOCS 。
无需,一旦它超出范围,即destructor将销毁容器对象。
您可以使用.clear()函数省略,因为一旦contentvector在'}'处范围范围内,向量驱动器的destructor就运行。
这处理了存储向量数据的内存。
,因为我认为其他人没有提到这一点,但是如果您的向量为
std::vector<std::string*> vector;
您应该在功能完成之前释放分配给每个元素的内存(除非您将所有权传递给其他地方 - 例如全局变量等)
)for (auto i : vector) {
delete i;
}
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- C++如果调用 vector,矢量分割错误会导致崩溃
- 调用 vector.erase() 函数时指针操作无效错误
- 我是否应始终在功能末尾调用vector clear()
- 在调用vector::assign()之前调用vector::reserve()更好吗?
- 在向量引用上调用 vector::reserve()
- 对存储在boost::any中的向量调用vector::size()
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 错误C2280:试图引用已删除的函数(试图调用vector.erase)
- 在C++中,为什么我可以在<double>类中调用 vector::begin() 来获取私有内容?
- 调用vector.erase()时出现分段错误
- 调用vector中对象的成员函数