下面是函数的一部分:
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
之前,先用手学习new
和delete
,这样你就会了解unique_ptr
的实际作用。
真正的高级程序员会意识到他们根本不使用new
,而只使用std::queue<std::string>
(无指针(。