簡體   English   中英

在向量中使用共享指針時內存泄漏

[英]Memory leaks when using shared pointers in a vector

在向向量添加共享指針時,我一直面臨內存泄漏問題,向量定義如下:

vector<shared_ptr<Recipe>> favorites;

(食譜是一個簡單的類,有2個簡單的字段)

以下函數用於向用戶的收藏夾添加配方:

void User::postRecipe(string recipeName) {
    if (!(*this).isConnected())
        throw UserNotConnectedException();
    if (!(*this).isInGroup())
        throw NotInGroupException();
    shared_ptr<User> owner = server->seekUser((*this).getId());
    shared_ptr<Recipe> recipe(new Recipe(recipeName, owner));
    server->postRecipe((*this).groupName, recipe);
    if (!checkIfRecipeInFavs(favorites, recipeName)) {
        favorites.push_back(recipe);
}

雖然程序編譯並且程序的輸出符合要求,但此函數的最后一行似乎會導致內存泄漏,如果刪除它,錯誤就會消失。

有任何想法嗎? 提前致謝。

Recipe.h:

class Recipe
{
    string name;
    shared_ptr<User> owner;
public:
    Recipe(string name, shared_ptr<User> owner):name(name),owner(owner){};
    ~Recipe(){};
    string getName();
    shared_ptr<User> getOwner();
};

Recipe.cpp:

string Recipe::getName(){
    return name;
}
shared_ptr<User> Recipe::getOwner(){
    return owner;
}

當您使用另一個共享指針將所有者存儲在配方中時,您將創建一個循環引用,這意味着只有在刪除用戶時才會刪除配方,但只有在刪除所有配方時才會刪除用戶。 您應該在Recipe中使用weak_ptr來打破循環。

這是因為shared_ptr使用簡單的引用計數來確定何時應該刪除它的指針:無論何時復制shared_ptr ,它的引用計數(保存在堆上,與pointee對象一起)都會增加,並且每當副本被銷毀時,計數減少了。 在析構函數中看到計數達到零的指針將刪除該對象。 當兩個shared_ptr相互引用時,計數永遠不會低於2。

暫無
暫無

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

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