簡體   English   中英

在C ++ Qt中刪除原始指針的替代方法

[英]Alternative to deleting raw pointer in C++ Qt

因此,我有以下用Qt C ++編寫的代碼:

// Post* derives from QObject
Post* post = new Post(this);
QString url;

ParseResult result = parse(url, post); // this function takes a Post* and modifies it

// if result is succesfully parsed
if(result == ParseResult::Success){
    // add the post to a std::vector<Post*> which is a member of the class
}
else{
    post->deleteLater();
}

現在,您可以看到我正在刪除原始指針Post* ,但是我想知道是否可以用不需要使用deleteLater()另一種方式來實現上面的deleteLater()

如果post不會活得比this ,並始終將是一個孩子this (這意味着它永遠不會重設父),那么你可以實例存儲在一個vectorunique_ptr<Post>

class This: /* ... */ {
// ...
    std::vector<std::unique_ptr<Post>> post_vec_;
};

現在,您的代碼可以省略刪除:

auto post = std::make_unique<Post>(this);
QString url;

ParseResult result = parse(url, post.get());
if (result == ParseResult::Success) {
    post_vec_.push_back(std::move(post));
    // 'post' was moved from, so it's just a nullptr now.
}

// No 'else' needed. 'post' is going to be deleted when it goes out of scope.

(這假設在原始代碼中post->deleteLater()可能已由delete post替換。似乎您沒有理由使用deleteLater()而不是直接調用delete 。)

this被摧毀,其成員將要調用基類的析構函數之前,首先摧毀。 因此, post_vec_將首先被銷毀,這意味着它包含的智能指針將刪除它們管理的Post對象。 這些對象的析構函數將從其父對象中取消注冊這些對象,因此不會發生雙重刪除。 這就是為什么此答案要求這些對象不能超過this並且不能被重新設置父級的原因。

最后一點,如果您不想在This標頭中公開Post類,則可以向前聲明它:

class Post;

class This: /* ... */ {
// ...
    std::vector<std::unique_ptr<Post>> post_vec_;
};

只要您在.cpp文件中實現析構函數, unique_ptr仍然可以使用它。 如果沒有析構函數,則可以使用默認析構函數,但需要在.cpp文件中將其默認設置:

class Post;

class This: /* ... */ {
public:
    // ...
    ~This() override;

// ...
    std::vector<std::unique_ptr<Post>> post_vec_;
};

.cpp文件中:

This::~This() = default;

暫無
暫無

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

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