2015-04-12 25 views
0

嗨,我正在研究C++中的多项式类。到目前为止,一切运作良好。但现在我遇到了一个错误,我只是不能当场:/C++多项式复制构造函数和ostream覆盖导致memeory泄漏?!

polynomial.cpp

// copy-constructor 
    Polynomial::Polynomial(const Polynomial &p){ 
     size = p.size; 
     buffer = p.buffer; 
     poly = new double(buffer); 

     for (int i = 0; i < size; ++i) poly[i] = p[i]; 
     for (int i = size; i < buffer; ++i) poly[i] = 0; 
    } 

// output stream override | it's a non-member function 
ostream& operator<<(ostream& os, const v1::Polynomial& p){  
    int degree = p.degree(); 
    stringstream ss; 

    if (degree == 0) ss << '0'; 
    else if (degree > 0){ 
     ss << '('; 
     for (int i = degree; i >= 0; --i){ 
      ss << p[i]; 
      ss << "x^"; 
      ss << i; 
      if (i > 0) 
       ss << " + "; 
     } 
     ss << ')' << endl; 

    } 
    os << ss.str(); 
    return os; 
} 

所以这是我如何调用拷贝构造函数:

// note: printing 'a' itself does not cause problems... 
v1::Polynomial b(a);  
cout << "Polynomial b: " << b << " degree: " << b.degree() << endl;; 

堆栈日志从Visual工作室说它在23行(这里:这一行上面的行,我实际上想打印'b'),然后它继续调用一些堆函数等。 运行程序而不进行调试(通过cmd)会导致APPCRASH,“Polynomial b:”是最后显示的东西。

可惜我不知道如何在Visual Studio调试,我用的valgrind在Linux中,我目前还没有设置:/

任何人任何想法?或者你需要额外的信息?

无论如何,提前很多感谢=)

+0

这里分配的内存在哪里?poly = new double(buffer);'实际删除了? _“我不幸不知道如何在Visual Studio中进行调试”_ F5 IIRC。 –

+0

如果崩溃可能存在,您需要提供'degree()'的代码。 –

+0

编写代码的好处是它不需要定制拷贝构造函数。 –

回答

4
poly = new double(buffer); 

在这里,您分配一个double并将其设置为buffer。你可能的意思是

poly = new double[buffer]; 

或任何你想要的大小。

A 很多更好的解决方案将使用std::vector而不是原始数组。你可以用=复制它,用std::vector::resize调整它的大小,并且用std::vector::reserve保留更多的空间。