Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带多个指针的复制constrctor_C++_Copy Constructor - Fatal编程技术网

C++ 带多个指针的复制constrctor

C++ 带多个指针的复制constrctor,c++,copy-constructor,C++,Copy Constructor,我试图为带有指针变量的类创建一个复制构造函数。但复制构造出了问题,因为我在尝试访问新对象中的指针时出错了 /* Copy Constructor */ Solver::Solver(const Solver &obj) { // Pointers to use in modified-Midpoint method. double *m_yTemp1 = new double[CONST_numVariables]; double *m_yTemp2

我试图为带有指针变量的类创建一个复制构造函数。但复制构造出了问题,因为我在尝试访问新对象中的指针时出错了

/* 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;
}
/*复制构造函数*/
解算器::解算器(常量)
求解器(obj)
{
//要在修改的中点方法中使用的指针。
double*m_yTemp1=新的double[CONST_numVariables];
double*m_yTemp2=新的double[CONST_numVariables];
double*m_dTemp=新的double[CONST_numVariables];
//用于存储外推数据表的三个指针。
double***m_extrapTableau=新的double**[CONST_maxDiv];
*m_extrapTableau=*对象m_extrapTableau;

对于(int i=0;i,SEGFULT的问题如下:

double ***m_extrapTableau = new double**[CONST_maxDiv];  // (1)
*m_extrapTableau          = *obj.m_extrapTableau;        // (2) 
在(1)中,您声明了构造函数的本地变量
m_extrapTableau

但在(2)中,我可以看到您有一个同名的类membber。因此,构造函数的本地
m_extrapTableau
将被正确初始化。但它隐藏了未初始化的类成员,以供后续使用

关于剩下的问题:

1) 如果您实现了一个复制构造函数,那么您必须注意复制您需要的所有内容

2)通过双或三次指针的请求,需要在使用表的任何元素之前迭代遍历每个级别,正确地使用指针。应该考虑使用向量的向量或向量的向量。这些更容易初始化、复制等。


3) 如果它们是常量,而您没有使用大括号初始值设定项将它们初始化为另一个值,那么它们应该是可用的。

使用
std::vector
,忘记所有这些三星级的废话。此外,我不确定您想用
*m_extrapTableau=*obj.m_extrapTableau;
之类的东西做什么,但它的作用是有限的如果我在类中有其他非指针变量,它们是自动复制的还是我也需要指定它们如果您提供自己的复制构造函数,则不会自动复制任何内容。仅供参考,您使用
*m_yTemp1=*obj.m_yTemp1;
的意图一点也不明显,它只是复制数组的第一个元素,但这正是正在发生的事情。我也不清楚为什么其中每一个都是局部自动变量。也就是说,您是decla将所有这些本地变量环化到复制ctor,从而隐藏实际的成员变量,以便它们(真正的成员)在完成时完全保持不变和不确定(因此seg错误)。随之而来的内存泄漏是一个额外的好处。为了避免异常不安全和其他错误,任何类都不应拥有多于一个的原始指针。换句话说,应该拥有指针的唯一类是容器和智能指针的实现。其结果是,任何更高级别的类通常根本不需要复制构造函数,因为它们的所有元素DTRT的副本。如果您想知道人们在谈论什么,。只要我们正在修复一个用原始指针完成的脆弱实现,那么不妨指出
i@WhozCraig我选择了“交换到向量”,它成功运行的时间比在这里发布的时间要少正在寻求帮助。显然,原始指针的复制构造函数和它们的多个级别超出了我的编码经验。当你在i@BenSouthworth实际上是
j