簡體   English   中英

如何開始編寫智能指針?

[英]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類中沒有計數器,為什么在refcounted類中沒有計數器? 我應該如何開始呢? 我不太擅長C ++。 提前致謝!

將我的評論擴展為答案:

第一個問題:該行應該執行的操作是在堆上創建一個新的refcounted類型的對象,然后使用隱式轉換構造函數創建指向該對象的智能指針,從而增加其內部引用計數。

第二個問題:看來您應該實現一個侵入式的ref-counted智能指針,其中引用計數存儲在指向的對象內。 這就是兩個引用計數函數的作用。 介入式引用計數的優點是空間效率更高(因為您不需要單獨分配引用計數),並且您可以采用原始指針並將其簡單地轉換為智能指針,而無需關心其他智能指針。已經存在。 它的缺點是無法指向任意類型,並且不支持弱指針。

第三個問題:首先要考慮創建,復制和銷毀智能指針的含義。

首先,這條線應該做什么?

my_pointer<refcounted> obj1 = new refcounted();

該行應從傳遞給它的經過refcounted原始指針初始化my_pointer<refcounted>智能指針。

我怎么可能實例化一個新的已引用對象並用my_pointer對象(指針?)引用它?

您可以使用轉換構造函數來實現 my_pointer沒有接受T*的構造函數,因此似乎已經可以定義。

為什么my_pointer類中沒有計數器,為什么在refcounted類中沒有計數器?

您顯然需要創建一個侵入式指針,該指針希望存儲的對象進行引用計數。

我應該如何開始呢?

我會看一看boost :: intrusive_ptr的描述和界面。 但是,您可能不需要完全相同的界面來進行分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM