如何在定义后调整全局std::vector<std::mutex>的大小?
std::mutex的vector调用resize报错的问题解析
错误原因解释
报错的核心原因是std::mutex是不可拷贝、不可移动的类型:它没有公开的拷贝构造函数、移动构造函数,也没有对应的赋值运算符。
vector的resize操作在调整容器大小的过程中,内部逻辑会尝试对元素进行构造/移动操作。当调用g_v.resize(2)时,vector的实现会检查元素类型是否支持从右值构造(即移动构造),但std::mutex不满足is_constructible<std::mutex, std::mutex&&>这个条件,因此触发了static_assert断言失败,导致编译错误。
解决方法
针对这个问题,有两种常见的可行方案:
方案1:用智能指针包装std::mutex
使用std::unique_ptr<std::mutex>作为vector的元素类型,因为unique_ptr支持移动语义,vector可以正常执行resize操作,同时由unique_ptr管理mutex的生命周期。示例代码如下:
#include <iostream> #include <vector> #include <mutex> #include <memory> std::vector<std::unique_ptr<std::mutex>> g_v; int main() { // 初始化4个动态分配的mutex for (int i = 0; i < 4; ++i) { g_v.emplace_back(std::make_unique<std::mutex>()); } g_v.resize(2); // 可正常执行,多余的unique_ptr会自动释放对应的mutex std::cout << "v.size() = " << g_v.size() << '\n'; }
方案2:提前确定vector大小,避免resize
如果业务逻辑允许,提前设定好vector的初始大小,后续不再执行resize操作,从根源上避免触发元素的移动/拷贝逻辑。示例代码如下:
#include <iostream> #include <vector> #include <mutex> // 直接初始化目标大小,避免后续resize std::vector<std::mutex> g_v(2); int main() { std::cout << "v.size() = " << g_v.size() << '\n'; }
内容的提问来源于stack exchange,提问作者dochoex
相关产品推荐
相关产品推荐

