c++ 多项式复制构造函数和 ostream 覆盖导致内存泄漏?!
c++ polynomial copy-constructor and ostream override cause memeory leaks?!
您好,我正在用 C++ 研究多项式 class。到目前为止一切都很好。但是现在我遇到了一个我根本无法发现的错误:/
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 Studio 的堆栈日志说它在第 23 行(这里:这一行上面的行,我实际上想打印的地方 'b')然后它继续调用一些堆函数ETC..
运行 未经调试(通过 cmd)的程序会生成 APPCRASH,"Polynomial b: " 是最后显示的内容。
不幸的是,我不知道如何在 Visual Studio 中进行调试,我习惯于在 linux 中使用 valgrind,目前我还没有设置 :/
有人知道吗?或者您需要更多信息吗?
无论如何,非常感谢 =)
poly = new double(buffer);
这里分配一个单double
设置为buffer
。你可能是说
poly = new double[buffer];
或您想要的任何尺寸。
更好的解决方案是使用 std::vector
而不是原始数组。您可以使用 =
复制它,使用 std::vector::resize
调整它的大小,并使用 std::vector::reserve
.
保留更多 space
您好,我正在用 C++ 研究多项式 class。到目前为止一切都很好。但是现在我遇到了一个我根本无法发现的错误:/
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 Studio 的堆栈日志说它在第 23 行(这里:这一行上面的行,我实际上想打印的地方 'b')然后它继续调用一些堆函数ETC.. 运行 未经调试(通过 cmd)的程序会生成 APPCRASH,"Polynomial b: " 是最后显示的内容。
不幸的是,我不知道如何在 Visual Studio 中进行调试,我习惯于在 linux 中使用 valgrind,目前我还没有设置 :/
有人知道吗?或者您需要更多信息吗?
无论如何,非常感谢 =)
poly = new double(buffer);
这里分配一个单double
设置为buffer
。你可能是说
poly = new double[buffer];
或您想要的任何尺寸。
更好的解决方案是使用 std::vector
而不是原始数组。您可以使用 =
复制它,使用 std::vector::resize
调整它的大小,并使用 std::vector::reserve
.