小编dwn*_*dwn的帖子

如果没有更多引用,如何从缓存中删除(非侵入式)智能指针?

由于我的noob声誉,我无法回复此主题,特别是接受的答案:

我从未使用过boost :: intrusive智能指针,但如果你使用shared_ptr智能指针,你可以使用weak_ptr对象作为缓存.

当系统决定释放内存时,那些weak_ptr指针不算作引用,但只要该对象尚未被删除,它就可用于检索shared_ptr.

这当然是一个直观的想法,但是,C++标准不支持weak_ptrs的比较,因此它不能用作关联容器的键.这可以通过为weak_ptrs实现比较运算符来规避:

template<class Ty1, class Ty2>
    bool operator<(
        const weak_ptr<Ty1>& _Left,
        const weak_ptr<Ty2>& _Right
    );
Run Code Online (Sandbox Code Playgroud)

这个解决方案的问题是

(1)比较运算符必须获得每次比较的所有权(即从weak_ptr refs创建shared_ptrs)

(2)当管理资源的最后一个shared_ptr被破坏时,weak_ptr不会从缓存中删除,但是过期的weak_ptr会保留在缓存中.

对于(2),我们可以提供自定义析构函数(DeleteThread),但是,这将需要再次从要删除的T*创建weak_ptr,然后可以使用它从缓存中擦除weak_ptr.

我的问题是,如果有更好的方法使用智能指针缓存(我使用VC100编译器,没有提升),或者我根本没有得到它?

干杯,丹尼尔

c++ caching smart-pointers shared-ptr weak-ptr

14
推荐指数
1
解决办法
1581
查看次数

Typescript 映射类型

建议使用映射类型而不是显式部分类型,请参阅 https://www.typescriptlang.org/docs/handbook/advanced-types.html#mapped-types

即代替

interface PersonPartial {
    name?: string;
    age?: number;
}
Run Code Online (Sandbox Code Playgroud)

我们会用

interface Person {
    name: string;
    age: number;
}
type Partial<T> = {
    [P in keyof T]?: T[P];
}
type PersonPartial = Partial<Person>;
Run Code Online (Sandbox Code Playgroud)

是否可以映射到另一个方向,例如

type NotPartial<T> = {
    [P in keyof T]!: T[P];
}
type Person = NotPartial<PersonPartial>;
Run Code Online (Sandbox Code Playgroud)

因为我有一个生成的部分接口,这会由于鸭子类型而破坏我的类型检查。

typescript mapped-types

2
推荐指数
1
解决办法
604
查看次数