【发布时间】:2021-09-27 08:37:22
【问题描述】:
这是函数的一部分:
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>(),但是对于这个超出范围的错误还有其他解决方案吗?
【问题讨论】:
-
std::unique_ptr。但实际上没有理由动态分配std::queue,因为它的存储本身又是动态分配的。只需返回值。 -
@Quentin 我决定返回一个指向它的指针,因为我想检查它是否是一个 NULL 指针(以防函数内部出现任何问题)。这是一个正当的理由吗?
-
没有。如果出现问题并且函数无法返回合理的结果,则抛出异常。
-
如果异常没有意义(如未能产生好的结果不是异常事件),请使用
std::optional。您还可以返回std::pair中的std::queue和bool。如果结果可以接受,请将bool设置为true。
标签: c++ memory memory-management scope