【发布时间】:2014-10-03 21:40:14
【问题描述】:
我正在尝试为具有指针变量的类创建一个复制构造函数。但是,复制构造出了点问题,因为当我尝试访问新对象中的指针时出现段错误...
/* 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;
}
我最初的问题是:
- 如果类中有其他非指针变量,它们是自动复制的还是我也需要指定它们?
- 如何处理传递双指针或三指针的地址?我想我可能做错了。
- 如果 CONST_numVariables 和 CONST_maxDiv 是类中设置的常量,是否可以在此复制构造函数中使用它们,假设它们在我复制对象时已设置?
【问题讨论】:
-
使用
std::vector,忘记所有这些三星级的废话。此外,我不确定你想用*m_extrapTableau = *obj.m_extrapTableau;之类的东西做什么,但它所做的几乎肯定不是你想要的。 -
"如果我在类中有其他非指针变量,它们是自动复制的还是我也需要指定它们?"如果您提供自己的复制构造函数,则不会自动复制任何内容。
-
仅供参考,您的 intent 与
*m_yTemp1 = *obj.m_yTemp1;完全不明显,只是复制数组的 first 元素,但是正是正在发生的事情。我也不清楚为什么每一个都是 local 自动变量。 IE。您将 all 声明为您的 copy-ctor 本地,从而隐藏您的实际成员变量,以便它们(真正的成员)完全不变并且在完成时不确定(因此你的段错误)。随之而来的内存泄漏是一个好处。 -
为避免异常不安全和其他错误,任何类都不应拥有一个以上的原始指针。换句话说,唯一应该拥有指针的类是容器和智能指针的实现。这样做的结果是任何更高级别的类通常根本不需要 copy-ctor,因为它们所有元素的 copy-ctor 都是 DTRT。
-
如果您想知道人们在谈论什么,see it live here。
标签: c++ copy-constructor