我正在尝试使用指针变量为类创建一个复制构造函数。虽然复制结构出了问题,但当我尝试在新对象中访问指针时会出现段错误...
/* Copy Constructor */
Solver::Solver(const
Solver &obj)
{
// Pointers to use in modified-Midpoint method.
double *m_yTemp1 = new double[CONST_numVariables];
double *m_yTemp2 = new double[CONST_numVariables];
double *m_dTemp = new double[CONST_numVariables];
// Triple pointer to store tableau of data for extrapolation.
double ***m_extrapTableau = new double**[CONST_maxDiv];
*m_extrapTableau = *obj.m_extrapTableau;
for(int i=0; i<CONST_maxDiv; i++)
{
m_extrapTableau[i] = new double*[i+1];
*m_extrapTableau[i] = *obj.m_extrapTableau[i];
for(int j=0; j<=i; j++)
{
m_extrapTableau[i][j] = new double[CONST_numVariables];
*m_extrapTableau[i][j] = *obj.m_extrapTableau[i][j];
}
}
// Pointer of step sizes for extrapolation of modified-Midpoint.
double *CONST_extrap = new double[CONST_maxDiv];
for(int i=0; i<CONST_maxDiv; i++)
{
CONST_extrap[i] = 2.*(i+1.);
}
// Change pointer of new object from already used memory to newly allocated.
*m_yTemp1 = *obj.m_yTemp1;
*m_yTemp2 = *obj.m_yTemp2;
*m_dTemp = *obj.m_dTemp;
*CONST_extrap = *obj.CONST_extrap;
}
我最初的问题是:
答案 0 :(得分:0)
您的段错误存在问题:
double ***m_extrapTableau = new double**[CONST_maxDiv]; // (1)
*m_extrapTableau = *obj.m_extrapTableau; // (2)
在(1)中,您将变量m_extrapTableau
LOCAL声明为构造函数
但是在(2)中我可以看到你有一个同名的类元素。因此,构造函数的本地m_extrapTableau
将被正确地初始化。但它隐藏了类成员,该成员将继续未初始化以供后续使用。
关于你剩下的问题:
1)如果您实现了复制构造函数,则必须注意复制所需的所有内容。
2)传递double或tripple指针的地址需要您在使用表的任何元素之前迭代初始化指针的每个级别。您应该考虑使用矢量矢量或矢量矢量矢量。这些更容易初始化,复制等......
3)如果它们是const并且你没有用支撑初始化器将它们初始化为另一个值,那么它们应该是可用的。