You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在定义后调整全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:26