类cpp中分配内存的问题



我试图写一个简单的类,表示多项式在CPP,但我有一个问题,可能与释放内存,我找不到任何内存泄漏。下面是我的代码示例,header:

#pragma once
#include <iostream>
using namespace std;
class wielomian
{
int n;
double* a;
public:
wielomian();
wielomian(int k);
wielomian(int k, double* t);
~wielomian();
wielomian& operator=(const wielomian& a);
friend wielomian operator*(const wielomian& a, const wielomian& b);
friend ostream& operator<<(ostream& out, const wielomian& a);
friend istream& operator>>(istream& in, wielomian& a);
}

方法和函数的定义

#include <iostream>
using namespace std;
#include "wielomian.h"
wielomian::wielomian() : n(0)
{
a = new (nothrow) double;
if (!a)
return;
a[0] = 1;
}
wielomian::wielomian(int k) : n(k)
{
a = new (nothrow) double[k + 1];
if (!a)
return;
for (int i = 0; i <= n; i++)
a[i] = 1;
}
wielomian::wielomian(int k, double* t): n(k)
{
a = new (nothrow) double[k + 1];
if (!a)
return;
for (int i = 0; i <= n; i++)
a[i] = t[i];
}
wielomian::~wielomian()
{
delete[] a;
}
wielomian operator*(const wielomian& a, const wielomian& b)
{
wielomian c(a.n + b.n);
for (int i = 0; i <= c.n; i++)
c.a[i] -= 1;
for (int i = 0; i <= a.n; i++)
for (int j = 0; j <= b.n; j++)
c.a[i + j] += b.a[j] * a.a[i];
return c;
}
ostream& operator<<(ostream& out, const wielomian& a)
{
for (int i = 0; i < a.n; i++)
out << a.a[a.n - i] << "x^" << a.n - i << "+";
out << a.a[0] << endl;
return out;
}
istream& operator>>(istream& in, wielomian& a)
{
int p;
cin >> p;
a.n = p;
delete[] a.a;
a.a = new (nothrow) double[p + 1];
if (!a.a)
cout << "Problem with memory allocation" << endl;
for (int i = 0; i <= a.n; i++)
{
cin >> p;
a.a[i] = p;
}
return cin;
} 
wielomian& wielomian::operator=(const wielomian& b)
{
if (n != b.n)
{
delete[] a;
a = new (nothrow) double[b.n+1];
if (!a)
cout << "Problem with memory allocation" << endl;
n = b.n;
}
for (int i = 0; i <= b.n; i++)
a[i] = b.a[i];
return *this;
}

和最后main:

#include <iostream>
using namespace std;
#include "wielomian.h"
int main()
{
double z[4] = { 1,2,3,4 };
wielomian p, a(2), x(3, z);
cout << p << x << a << endl;
wielomian e;
e = a * x;
cout << e << endl;
}

当析构函数被注释掉时,一切都工作正常,所以这就是为什么我猜测内存分配有问题。如果有人能发现我代码中的任何错误,我会非常高兴。提前感谢

编辑:多亏了你的回答,问题解决了,我完全忘记了复制构造函数,也删除了[]不适合一个元素的多项式。谢谢你:)

问题的根源是operator*按值返回wielomian,但wielomian类没有自定义复制构造函数。

默认复制构造函数只是复制数据成员,包括指针a,现在您将有两个对象使用相同的指针。第一个函数的析构函数将释放内存,然后当第二个函数的析构函数试图释放相同的内存时,您将得到一个double-freebug(如何追踪"双重自由"或"腐败")错误).

更广泛的:每当您的类手动管理资源时(就像您对a数据成员的内存所做的那样),您必须了解3/5/0规则。:三/五/零的规则。

另一个问题是newdelete[]之间的不匹配,正如@ shadowwranger所指出的。

但是,即使这些问题可以修复,正如@eerorika在上面的评论中指出的那样,使用std::vector将更加健壮,并使您能够完全避免问题(它将允许您从3/5规则转变为0 -参见上面的链接)。

最新更新