如何开始编写智能指针?

How to begin writing a smart pointer?

大学刚接到一个任务,就是写一个智能指针。我收到了一个骨架,我需要实现所需的方法。如果我是对的,智能指针是一种指针,它计算给定对象的引用号(?),如果该计数器达到零,它会删除给定的对象。

这是骨架:

template<class T>
class my_pointer {
public:       
    my_pointer();
};

class refcounted {
    /* the reference counted types should have the public interface that is defined here */
public:     
    int incRefCnt();
    int decRefCnt();
};

int main() {
    my_pointer<refcounted> obj1 = new refcounted();
    my_pointer<refcounted> obj2 = obj1;

    return 0;
}

首先,这条线应该做什么? refcounted 不是 my_pointer 的子对象,所以我怎么可能实例化一个新的 refcounted 对象并用 my_pointer 对象(指针?)引用它?

my_pointer<refcounted> obj1 = new refcounted();

为什么 my_pointer class 中没有计数器,为什么 refcounted class 中有计数器?我应该如何开始呢?我不太擅长c++。提前致谢!

将我的评论扩展为答案:

第一个问题:该行应该做的是在堆上创建一个refcounted类型的新对象,然后使用隐式转换构造函数创建指向该对象的智能指针,递增它的内部引用计数。

第二个问题:看来您应该实现一个侵入式引用计数智能指针,其中引用计数存储在指向的对象中。这就是两个引用计数函数的作用。侵入式引用计数的优点是更 space 高效(因为您不需要单独分配引用计数),并且您可以采用原始指针并将其简单地转换为智能指针,而无需关心其他已经存在的智能指针。缺点是不能指向任意类型,不支持弱指针

第三题:你先想想创建、复制、销毁智能指针是什么意思

Firstly, what should this line do?

my_pointer<refcounted> obj1 = new refcounted();

该行应该从传递给它的 refcounted 原始指针初始化一个 my_pointer<refcounted> 智能指针。

how can I possibly instantiate a new refcounted object and reference it with a my_pointer object (pointer?)?

您可以使用 converting constructor 来完成。 my_pointer 没有接受 T* 的构造函数,因此似乎留给您定义。

Why isn't there a counter in the my_pointer class, and why is the counter in the refcounted class?

您的任务显然是创建一个侵入式指针,它期望存储的对象进行引用计数。

How should I start with this?

我会看一眼boost::intrusive_ptr的描述和界面。不过,您的作业可能不需要那么完整的界面。