在vector中使用共享指针时发生内存泄漏
Memory leaks when using shared pointers in a vector
我一直面临着内存泄漏的问题,当添加一个共享指针到一个向量,向量定义如下:
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。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏