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>>。但我建议先学习newdelete,然后再学习unique_ptr,这样你就会明白unique_ptr ] 确实如此。

真正高级的程序员会意识到他们根本不会 new,而只是使用 std::queue<std::string>(没有指针)。