[英]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
(這意味着它永遠不會重設父),那么你可以實例存儲在一個vector
的unique_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.