std:::weak_ptr插入和删除的一组标准。

问题描述 投票:0回答:1

在我的主应用程序中,我有一个 std::set<std::shared_ptr<Object>>. 我还想创建一套辅助的 std::set<std::weak_ptr<Object>> 因为我不想递增引用计数,但我也想避免使用锁来调用坏的内存位置。不幸的是,我不能定义一个 std::setstd::weak_ptr的内部。这样做后,编译器在插入和删除方法中出现了一些错误。

#include <memory>
#include <set>
#include <vector>
class Test{
private:
    int x ;
public:
    Test(int x){
        this->x = x;
    }
    int getx(){
        return x;
    }
};
int main(){
    std::shared_ptr<Test> t = std::make_shared<Test>(10);
    std::weak_ptr<Test> ref = std::weak_ptr<Test>(t);
    std::set<std::weak_ptr<Test>> weakrefs;
    weakrefs.insert(ref);//compiler error
    weakrefs.erase(ref);//compiler error
}

但是当我使用 std::vector<std::weak_ptr<Test>>我可以推后和弹回。但我希望有类似的功能 std::set.

c++11 smart-pointers
1个回答
2
投票

要有一套 weak_ptr的,你需要 std::owner_less<>,一个特殊的比较运算符。

std::set<std::weak_ptr<Test>, std::owner_less<std::weak_ptr<Test>>> weakrefs;

这个比较运算符使用管理区域来查找智能指针,而不是查找它们所指向的对象的指针。这一点是必要的,因为当智能指针还在 std::set.

实际上,你还应该使用 std::owner_less 对于一组 shared_ptrs.


1
投票

但是当我使用std::vector<std::weak_ptr<Test>>时,我可以推后和弹回。但我希望有类似于std::set的功能。

std::set 是一个有序的容器。这意味着当你插入一些东西时,数据结构需要一些比较来找到它的正确位置(在内部树内)。正因为如此,正如 @j6t 所提到的,你需要在定义 set 的同时引入一个比较操作符。这对于 std::vector 因为 std::vector 你把元素一个接一个地保留下来,不做任何比较。

© www.soinside.com 2019 - 2024. All rights reserved.