是什么导致“ std :: bad_alloc”在此代码中抛出?

时间:2018-11-18 17:48:31

标签: c++ memory

我正在尝试解决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>>(并更改代码的其他各个小部分,使其有意义),就可以正常工作。

什么是导致此错误的原因?没有无限循环,递归有一个定义明确的基本案例,而且我认为我没有分配过多的内存。我看不到程序如何无法分配内存。

2 个答案:

答案 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?