我使用 std::shared_ptr 时遇到了双重释放错误,并试图了解原因。我在多线程环境中使用shared_ptr,一个线程有时会替换全局数组中的某些元素
std::shared_ptr<Bucket> globalTable[100]; // global elements storage
使用:
globalTable[idx].reset(newBucket);
另一个线程有时使用以下方式读取此表:
std::shared_ptr<Bucket> bkt(globalTable[pIdx]);
// do calculations with bkt-> items
此后我收到双重释放错误,AddressSanitizer 表示第二个代码尝试释放被第一个代码破坏的对象。怎么可能?据我所知,shared_ptr 必须是完全线程安全的。
最佳答案
并非 std::shared_ptr
上的所有操作都是线程安全的。
具体来说,引用计数是以原子方式管理的,但您有责任确保您访问的 std::shared_ptr
实例不会同时被修改。
您没有履行这一责任,导致数据争用和预期的未定义行为,在您的情况下表现为双重释放。
关于c++ - 多线程 std::shared_ptr 读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968500/