[英]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.