C++释放函数中堆分配的变量



下面是函数的一部分:

std::queue<std::string>* shunting_yard(std::vector<std::string> input){
std::queue<std::string>* output = new std::queue<std::string>();
...
return output;

我已经在堆上动态分配了output所指向的队列。但是,当我尝试释放/删除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>();

不将名为CCD_ 8的变量与CCD_。它分配一个没有名称的队列,并创建一个名为output的局部变量,并将队列的地址存储到局部变量output中。

此行:

return output;

返回队列的地址。因为它也结束了函数,所以局部变量output被销毁(就像所有局部变量一样(。呼叫者接收地址。

如何调用此函数?你没有显示那个代码,但它有点像:

std::queue<std::string>* woof = shunting_yard(meow);

在这种情况下,这会在调用者中创建一个新的本地变量,称为woof,它现在保存shunting_yard创建的队列的地址。

您可以通过将队列地址传递给delete来删除队列。其地址存储在变量CCD_ 16中。所以你可以写delete woof;。地址存储在不同的变量中这一事实无关紧要,只要地址相同即可。


更高级的程序员将使用std::unique_ptr<std::queue<std::string>>。但我建议在学习unique_ptr之前,先用手学习newdelete,这样你就会了解unique_ptr的实际作用。

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

相关内容

  • 没有找到相关文章

最新更新