在向量中使用共享指针时内存泄漏

Niz*_*ias 2 c++ memory-leaks vector shared-ptr

在向向量添加共享指针时,我一直面临内存泄漏问题,向量定义如下:

vector<shared_ptr<Recipe>> favorites;
Run Code Online (Sandbox Code Playgroud)

(食谱是一个简单的类,有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);
}
Run Code Online (Sandbox Code Playgroud)

虽然程序编译并且程序的输出符合要求,但此函数的最后一行似乎会导致内存泄漏,如果删除它,错误就会消失.

有任何想法吗?提前致谢.

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();
};
Run Code Online (Sandbox Code Playgroud)

Recipe.cpp:

string Recipe::getName(){
    return name;
}
shared_ptr<User> Recipe::getOwner(){
    return owner;
}
Run Code Online (Sandbox Code Playgroud)

Obe*_*ron 8

当您使用另一个共享指针将所有者存储在配方中时,您将创建一个循环引用,这意味着只有在删除用户时才会删除配方,但只有在删除所有配方时才会删除用户.您应该weak_ptr在Recipe中使用来打破循环.

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