【发布时间】:2017-03-21 13:23:21
【问题描述】:
我正在用 C++ 构造一个多项式类。目前我正在读取输入并创建一个带有度数和系数(双)数组的多项式对象。
例如。
6x^3+7.4x^2-3.0x+9
Polynomial
----------
degree = 3
coefficients[0] = 6
coefficients[1] = 7.4
coefficients[2] = 3.0
coefficients[3] = 9
我在删除我的班级实例时遇到错误。我不确定到底是什么问题...以及SEGFAULT 我的错误看起来像:
Segmentation fault: 11
0x00007ffff71fdfbd in malloc_printerr (ptr=<optimized out>,
str=0x7ffff7304ad8 "free(): invalid next size (fast)", action=<optimized out>) at malloc.c:4983
_int_free (have_lock=0, p=<optimized out>, av=<optimized out>) at malloc.c:3850
__GI___libc_free (mem=<optimized out>) at malloc.c:2960
我的构造函数看起来像:
/* Constructor for Polynomial */
Polynomial::Polynomial ()
{
degree = 0;
coefficients = new double [1];
coefficients[0] = 0;
}
Polynomial::Polynomial (const Polynomial & P)
{
*this = P;
}
赋值运算符:
Polynomial & Polynomial::operator = (const Polynomial & P)
{
if (this != &P){
degree = P.degree;
coefficients = new double [P.degree + 1];
for (int i = 0; i <= P.degree; i++)
coefficients[i] = P.coefficients[i];
}
return *this;
}
我的析构函数看起来像:
/* Destructor for Polynomial */
Polynomial::~Polynomial ()
{
delete [] coefficients; <--ERROR HERE
}
我在 main() 中的实现如下所示:
vector<Polynomial> Polys;
Polynomial *P1 = new Polynomial();
...
P1->degree = degreeInt;
P1->coefficients[idx] = coefficient;
Polys.push_back(*P1);
delete P1; <-- ERROR HERE
// Pushed Polynomial to Vector, create a new Polynomial object
P1 = new Polynomial();
【问题讨论】:
-
您需要一个赋值运算符和复制构造函数,但没有明显的理由首先应该动态分配
coefficients。 -
P1->coefficients[idx] = coefficient;可能是越界访问。 -
您的第一步是了解内存泄漏和段错误之间的区别。
-
内存泄漏是指您忘记删除某些内容,而不是尝试删除某些内容时出错。
-
保持我当前对数组 [] 系数的实现我实现了一个复制构造函数和赋值运算符,如下所示:
degree = P.degree; coefficients = new double [degree + 1]; for (int i = 0; i <= degree; i++) coefficients[i] = P.coefficients[i];这不起作用,我该如何修改它才能工作? @EJP
标签: c++ class memory-leaks segmentation-fault destructor