0

我正在尝试清除我的 C++。我拼凑了一个简单的程序来找到带有记忆的斐波那契数列。有内存泄漏,我似乎无法弄清楚原因。泄漏在 Fibonacci::setToFind 中报告。

抱歉,代码块很长,但我不知道如何制作一个更简单的可重现示例。

#include <iostream>

class Fibonacci
{
public:
    int m_valuefound;
    int m_tofind;
    long int *m_memo;

    int findValue(int value){
        if (m_memo[value] == 0) {
            if (value == 0 || value == 1) {
                m_memo[value] = 1;
            } else {
                m_memo[value] = findValue(value-1) + findValue(value-2);
            }
        }
        return m_memo[value];
    }

    void setToFind(int value){
        m_tofind = value;
        m_memo = new long int[value];

        std::fill_n(m_memo,value,0);
    }

    void solve(){

        int value = m_tofind;
        int result = findValue(value);

        std::cout<< "Value is: " << result << std::endl;
    }

    ~Fibonacci(){};


};

int main (int argc, char * const argv[]) {
    std::cout << "Enter integer values until you'd like to quit.  Enter 0 to quit:";

    int user_ind=0;

    // for testing non-interactivly
    while(true){
    for (user_ind=1; user_ind<45; user_ind++) {
        Fibonacci *test = new Fibonacci;
        test->setToFind(user_ind);
        test->solve();
            delete test;
    }

    }

    return 0;
}
4

4 回答 4

5

你永远不会m_memoFibonacci.

由于您将 m_memo 分配为数组,因此您应该删除delete[] m_memo

于 2013-05-01T18:55:32.937 回答
2

这是具有不可复制Fibonacci类的工作代码。为什么不在构造函数中分配内存。尽可能使用 RAII 并记住五法则。首先使用std::vector.

#include <iostream>

class Fibonacci
{
public:
    int m_valuefound;
    int m_tofind;
    long int *m_memo;

    int findValue(int value){
        if (m_memo[value] == 0) {
            if (value == 0 || value == 1) {
                m_memo[value] = 1;
            } else {
                m_memo[value] = findValue(value-1) + findValue(value-2);
            }
        }
        return m_memo[value];
    }

    void setToFind(int value){
        m_tofind = value;
        m_memo = new long int[value];

        std::fill_n(m_memo,value,0);
    }

    void solve(){

        int value = m_tofind;
        int result = findValue(value);

        std::cout<< "Value is: " << result << std::endl;
    }

  // why don't you allocate in the constructor?
  Fibonacci() : m_valuefound(0), m_tofind(0), m_memo(nullptr) {}

  ~Fibonacci() {
    delete[] m_memo;
  };
  // make the class non-copyable
  Fibonacci(const Fibonacci&) = delete;
  const Fibonacci& operator=(const Fibonacci&) = delete;
  /*
    C++03 non-copyable emulation
private:
  Fibonacci(const Fibonacci&);
  const Fibonacci& operator=(const Fibonacci&);
  */
};
于 2013-05-01T18:59:41.283 回答
1

您正在m_memo分配setToFind

m_memo = new long int[value];

但你destructor没有delete [] m_memo. 如果使用 C++11 ,您应该通过禁用和使用来初始化m_memo您的constructor类并使您的类不可复制:copy constructorassignment operatordelete

Fibonacci(const Fibonacci&) = delete;
const Fibonacci& operator=(const Fibonacci&) = delete;

否则,您可以将它们设为私有。如果你使用这样的容器,std::vector你的生活会简单得多。

于 2013-05-01T18:58:18.380 回答
0

我建议你使用更多的 STL 算法。这是一个带有相当未优化的仿函数的代码片段,但您可以了解 STL 的强大功能:

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

class Fibonacci
{
public:
    Fibonacci();
    ~Fibonacci() {}

    int operator()();
private:
    int n0_;
    int n1_;
    int n_;
};

Fibonacci::Fibonacci():n0_(0),n1_(1),n_(0)
{
}

int Fibonacci::operator()()
{
    if(n_ > 1)
        return (++n0_) + (++n1_);
    else
        return ++n_;
}

using namespace std;
int main()
{
    Fibonacci func;
    vector<int> v;

    //generate 100 elements
    generate_n(v.begin(),100,func);

    //printing the values using a lambda expression
    for_each(v.begin(),v.end(),[](const int val){cout << val << endl;});

    return 0;
}

然后,您可以使用find_if并定义您自己的函子在向量上应用您想要的查找算法。

于 2013-05-01T22:23:51.643 回答