我是否应始终在功能末尾调用vector clear()

Should I always call vector clear() at the end of the function?

本文关键字:调用 vector clear 功能 是否      更新时间:2023-10-16

我有一些简单的功能,它使用这样的向量(伪代码):

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;
}