我正在尝试解决Leetcode Problem 22(这是一个非常简单的递归应用程序),并且我试图记住结果以便加快计算速度。但是,当我尝试存储指向矢量的指针列表时,我遇到了std::bad_alloc
错误,而当我仅存储指针列表时,程序运行正常。我对C ++和指针以及内存分配还比较陌生,所以这可能是一个非常愚蠢的问题,但是我已经看了一段时间了,我似乎无法弄清楚。
所以,这是代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
vector<string> generateParenthesis(int n) {
if (n == 0) {
return {};
}
return generateParenthesis_recursive(n);
}
vector<vector<string>*> memo;
vector<string> generateParenthesis_recursive(unsigned int n) {
if (n < memo.size()) {
return *(memo[n]);
}
vector<string> result;
if (n == 0) {
result = {""};
}
else if (n == 1) {
result = {"()"};
}
else if (n > 1) {
vector<string> left, right;
for (unsigned int k = 0; k < n; k++) {
left = generateParenthesis_recursive(k);
right = generateParenthesis_recursive(n - k - 1);
for (auto left_parenths : left) {
for (auto right_parenths : right) {
result.push_back("(" + left_parenths + ")" + right_parenths);
}
}
}
}
while (memo.size() <= n) {
memo.push_back(nullptr);
}
memo[n] = &result;
return result;
}
};
int main(int argc, char const *argv[]) {
Solution s;
vector<string> output = s.generateParenthesis(4);
for (auto s : output) {
cout << s << " ";
}
cout << endl;
return 0;
}
我不太确定在哪里或为什么,但这会引发std::bad_alloc
错误。但是,将memo
更改为vector<vector<string>>
(并更改代码的其他各个小部分,使其有意义),就可以正常工作。
什么是导致此错误的原因?没有无限循环,递归有一个定义明确的基本案例,而且我认为我没有分配过多的内存。我看不到程序如何无法分配内存。
答案 0 :(得分:0)
问题在这里:
memo[n] = &result;
因为您要引用局部变量。您可以将其更改为以下内容:
memo[n] = new vector<string>(result);
但是请记住,您需要手动释放这些指针。
答案 1 :(得分:-1)
Some programmer dude在评论中说,罪魁祸首是这一行
memo[n] = &result;
因为您为result
分配了对局部变量(memo
)的引用,该引用超出了函数结尾的范围。
可以通过将声明vector<string> result;
{em>移到函数的外部来解决此问题,如下所示:
vector<vector<string>*> memo;
vector<string> result;
vector<string> generateParenthesis_recursive(unsigned int n) {
//...
此外,考虑使用智能指针-如果确实需要指针,那就是。参见:What is a smart pointer and when should I use one?