在vector中使用共享指针时发生内存泄漏

Memory leaks when using shared pointers in a vector

本文关键字:内存 泄漏 指针 共享 vector      更新时间:2023-10-16

我一直面临着内存泄漏的问题,当添加一个共享指针到一个向量,向量定义如下:

vector<shared_ptr<Recipe>> favorites;

(Recipe是一个有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中时,您创建了一个循环引用,这意味着,只有当User被删除时Recipe才会被删除,但是只有当所有Recipes被删除时User才会被删除。你应该使用Recipe中的weak_ptr来打破这个循环。

这是因为shared_ptr使用简单的引用计数来确定何时应该删除它的指针:每当您复制shared_ptr时,它的引用计数(与指针对象一起保存在堆上)都会增加,而每当副本被销毁时,计数都会减少。在析构函数中看到计数为零的指针将删除该对象。当两个shared_ptr相互引用时,计数永远不会低于2。