C++ 释放函数中堆分配的变量
C++ freeing heap-allocated variables in functions
这是函数的一部分:
std::queue<std::string>* shunting_yard(std::vector<std::string> input){
std::queue<std::string>* output = new std::queue<std::string>();
...
return output;
我动态分配队列 output
指向堆上。但是,当我尝试 free/delete int main()
中的队列时,出现错误,因为 output
被声明为超出范围。
考虑到我在上面的函数中返回 output
- 所以我不能在函数内部释放它 - 我如何确保没有内存泄漏?我想到的一种可能的解决方案是在全局范围内声明 std::queue<std::string>* output
并在函数内部声明 output = new std::queue<std::string>()
,但是对于这个超出范围的错误还有其他解决方案吗?
您不删除变量或指针。您删除使用 new
分配的内容。该行:
std::queue<std::string>* output = new std::queue<std::string>();
不分配名为 output
的变量 new
。它分配一个没有名称的队列,并创建一个名为 output
的局部变量,并将队列的地址存储到局部变量 output
.
这一行:
return output;
returns队列的地址。因为它也结束了函数,所以局部变量output
被销毁了(就像所有的局部变量一样)。来电者收到地址。
这个函数怎么调用?您没有显示该代码,但它类似于:
std::queue<std::string>* woof = shunting_yard(meow);
在这种情况下,这会在调用者中创建一个新的局部变量,称为 woof
,它现在保存 shunting_yard
创建的队列的地址。
您可以通过将其地址传递给 delete
来删除队列。它的地址存储在变量woof
中。所以可以写delete woof;
。地址存储在不同变量中这一事实无关紧要,只要地址相同即可。
更高级的程序员将使用 std::unique_ptr<std::queue<std::string>>
。但我建议先学习new
和delete
,然后再学习unique_ptr
,这样你就会明白unique_ptr
] 确实如此。
真正高级的程序员会意识到他们根本不会 new
,而只是使用 std::queue<std::string>
(没有指针)。
这是函数的一部分:
std::queue<std::string>* shunting_yard(std::vector<std::string> input){
std::queue<std::string>* output = new std::queue<std::string>();
...
return output;
我动态分配队列 output
指向堆上。但是,当我尝试 free/delete int main()
中的队列时,出现错误,因为 output
被声明为超出范围。
考虑到我在上面的函数中返回 output
- 所以我不能在函数内部释放它 - 我如何确保没有内存泄漏?我想到的一种可能的解决方案是在全局范围内声明 std::queue<std::string>* output
并在函数内部声明 output = new std::queue<std::string>()
,但是对于这个超出范围的错误还有其他解决方案吗?
您不删除变量或指针。您删除使用 new
分配的内容。该行:
std::queue<std::string>* output = new std::queue<std::string>();
不分配名为 output
的变量 new
。它分配一个没有名称的队列,并创建一个名为 output
的局部变量,并将队列的地址存储到局部变量 output
.
这一行:
return output;
returns队列的地址。因为它也结束了函数,所以局部变量output
被销毁了(就像所有的局部变量一样)。来电者收到地址。
这个函数怎么调用?您没有显示该代码,但它类似于:
std::queue<std::string>* woof = shunting_yard(meow);
在这种情况下,这会在调用者中创建一个新的局部变量,称为 woof
,它现在保存 shunting_yard
创建的队列的地址。
您可以通过将其地址传递给 delete
来删除队列。它的地址存储在变量woof
中。所以可以写delete woof;
。地址存储在不同变量中这一事实无关紧要,只要地址相同即可。
更高级的程序员将使用 std::unique_ptr<std::queue<std::string>>
。但我建议先学习new
和delete
,然后再学习unique_ptr
,这样你就会明白unique_ptr
] 确实如此。
真正高级的程序员会意识到他们根本不会 new
,而只是使用 std::queue<std::string>
(没有指针)。