【发布时间】:2014-08-13 23:55:33
【问题描述】:
我在向向量添加共享指针时一直面临内存泄漏的问题,向量定义如下:
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);
}
虽然程序可以编译,程序的输出也符合要求,但这个函数的最后一行似乎会导致内存泄漏,如果删除,错误就会消失。
有什么想法吗?提前致谢。
食谱.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();
};
配方.cpp:
string Recipe::getName(){
return name;
}
shared_ptr<User> Recipe::getOwner(){
return owner;
}
【问题讨论】:
-
'这个函数的最后一行似乎导致了内存泄漏......'你是怎么检测到这个的?
-
提示:您可以使用
this->member代替(*this).member。这将使代码更具可读性。 -
使用 Valgrind,当这条线被删除时,Valgrind 没有检测到错误
-
@NizarElias
Recipe类是否有复制构造函数、赋值运算符或析构函数?如果是,请尝试删除它们(错误可能存在)。另外,如果没有帮助,请发布他们的代码(编辑您的问题并添加代码)。 -
是什么让您认为将所有这些共享指针保存在
favorites成员中的User对象本身不是泄漏的根源?您发布的代码具有循环所有权。用户拥有食谱,并且每个食谱在 它的 所有权列表中都有相同的用户。
标签: c++ vector memory-leaks shared-ptr