我正在为一个数学项目写一个矩阵类,我有一个奇怪的问题,我写的复制构造函数在一个函数中失败但在另一个函数中成功 - 并且情况看似相同。 我通过gdb运行它并且复制构造函数执行但不知何故只是在完成后不分配值。

这是gdb的输出:

(gdb) break main.cpp:20
Breakpoint 1 at 0x8048913: file main.cpp, line 20.
(gdb) run
Starting program: /home/ian/Documents/math471/src/compress 
printing
1 1 1 1 
1 2 3 4 
1 3 5 7 
1 4 7 10 
printing
1 1 1 1 
1 2 3 4 
1 3 5 7 
1 4 7 10 
printing
1 1 1 1 
1 2 3 4 
1 3 5 7 
1 4 7 10 
printing
1 1 1 1 
1 2 3 4 
1 3 5 7 
1 4 7 10 

Breakpoint 1, main (argc=1, argv=0xbffff334) at main.cpp:20
20          tridiagonalize(A);
(gdb) s
tridiagonalize (A=...) at tridiagonalize.cpp:10
10          Matrix result(A);
(gdb) print result
$1 = {transposed = false, height = 3903476, width = 0, data = 0x0}
(gdb) s
Matrix::Matrix (this=0xbffff23c, A=...) at matrix.cpp:176
176         height = A.getHeight();
(gdb) print height
$2 = 0
(gdb) n
177         width = A.getWidth();
(gdb) print height
$3 = 4
(gdb) n
178         data = new double*[height];
(gdb) print width
$4 = 4
(gdb) n
179         for(int i = 0; i < height; i++){
(gdb) break matrix.cpp:185
Breakpoint 2 at 0x80492ba: file matrix.cpp, line 185.
(gdb) c
Continuing.

Breakpoint 2, Matrix::Matrix (this=0xbffff23c, A=...) at matrix.cpp:185
185         transposed = false;
(gdb) n
186 }
(gdb) print transposed
$5 = false
(gdb) print this
$6 = (Matrix * const) 0xbffff23c
(gdb) print this->height
$7 = 4
(gdb) n
tridiagonalize (A=...) at tridiagonalize.cpp:11
11          int n = A.getWidth();
(gdb) print result
$8 = {transposed = false, height = 3903476, width = 0, data = 0x0}
(gdb) 

如您所见,结果中的值与构造函数之前的值相同。

#include "matrix.h"
#include "tridiagonalize.h"


using namespace std;

void function(Matrix &A);

int main(int argc, char** argv){

        Matrix A(4, 4);
        for(int i = 0; i < 16; i++){
                A.set(i/4, i%4, (i%4)*(i/4)+1);
        }
        function(A);
        Matrix B = A;
        A.print();
        B.print();

        tridiagonalize(A);
        //A.print();

        return 0;
}

void function(Matrix &A){
        Matrix result(A);
        A.print();
        result.print();
}

Matrix tridiagonalize(Matrix &A){

        Matrix result(A);
        int n = A.getWidth();
        cout << "width: " << n << endl;
        cout << "width of result: " << result.getWidth() << endl;
            return result;
}

编辑:这是矩阵代码:

void Matrix::set(int i, int j, double value){
        if(transposed){
                int tmp = i;
                i = j;
                j = tmp;
        }
        if(i < 0 || j < 0 || i >= height || j >= width){
                cout << "trying to set value outside of matrix" << endl;
                return;
        }
        if(height > 0 && width > 0){
                data[i][j] = value;
        }
        return;
}

void Matrix::print() const{
        cout << "printing" << endl;
        if(!transposed){
                for(int i = 0; i < height; i++){
                        for(int j = 0; j < width; j++){
                                cout << data[i][j] << " ";
                        }
                        cout << endl;
                }
        }
        else{
                for(int i = 0; i < width; i++){
                        for(int j = 0; j < height; j++){
                                cout << data[j][i] << " ";
                        }
                        cout << endl;
                }
        }
        return;
}

Matrix::~Matrix(){
        //cout << "deleting Matrix" << endl;
        if(data != NULL){
                for(int i = 0; i < height; i++){
                        //cout << data[i] << endl;
                        delete[] data[i];
                }
                //cout << data << endl;
                delete[] data;
        }
}

double Matrix::get(int i, int j) const {
        if(transposed){
                int tmp = i;
                i = j;
                j = tmp;
        }
        if(data != NULL && i >=0 && j >= 0 && i < height && j < width){
                return data[i][j];
        }
        else{
                cout << "error in get" << endl;
        }
        return -1;
}

int Matrix::getHeight() const {
        if(transposed){
                return width;
        }
        else{
                return height;
        }
}

int Matrix::getWidth() const {
        if(transposed){
                return height;
        }
        else{
                return width;
        }
}



Matrix::Matrix(const Matrix& A){
        height = A.getHeight();
        width = A.getWidth();
        data = new double*[height];
        for(int i = 0; i < height; i++){
                data[i] = new double[width];
                for(int j = 0; j < width; j++){
                        data[i][j] = A.get(i,j);
                }
        }
        transposed = false;
}

Matrix Matrix::operator= (Matrix &B){
        if(data != NULL){
                for(int i = 0; i < height; i++){
                        delete[] data[i];
                }
                delete[] data;
        }
        data = NULL;
        Matrix result(B);
        return result;
}

tridiagonalize函数和'function'函数设置相同,但function()工作,tridiagonalize()不工作。 任何想法为什么会这样?

编辑:添加矩阵代码

===============>>#1 票数:2 已采纳

Matrix::operator=()无法正常工作,它释放旧data数组,但不会创建一个带有应分配数据的新数据。

它应该看起来像这样:

Matrix& Matrix::operator= (const Matrix &B){
   // Don't do anything if B is the same object
   if (&B == this)
      return *this;

   // delete data, as in the current version
   if(data != NULL){
      ...
   }

   // Create new array of arrays, fill with numbers from B
   data = new double*[B.getHeight()];
   ...

   return *this;
}

  ask by Ian translate from so

未解决问题?本站智能推荐:

1回复

C ++在复制构造函数中初始化列表分配,并在复制构造函数中崩溃

我遇到一种情况,无法重新定义初始化列表中定义的值。 我想在复制构造函数中重新定义它。 我将丢弃一些示例代码。 我还遇到一个问题,即程序进入复制构造函数的for循环后会崩溃。 看到那里有什么疯狂的事情吗? 似乎没有崩溃就不会使其脱离for循环。 在头文件中: 在CPP文件中
4回复

复制构造函数和默认构造函数

在为类定义复制构造函数时,是否必须显式定义默认构造函数? 请说明原因。 例如: 另外,如果我们为复制构造函数以外的类定义任何其他参数化构造函数,我们是否还必须定义默认构造函数? 考虑上面没有复制构造函数的代码并替换它 Alrite ....看到答案后,我写了下面的程序。
2回复

复制构造函数和调用函数

我试图在复制构造函数中调用一个访问器函数,但它不起作用。 这是我的问题的一个例子: 啊 A.cpp 当我尝试编译它时,我收到以下错误: 如果我将rhs.getData()更改为rhs.data ,那么构造函数可以正常工作。 我不允许在复制构造函数中调用函数吗?
5回复

复制构造函数如何工作?

复制构造函数如何在C ++中工作 错误1错误C2064:项不求值于带有1个参数的函数c:\\ users \\ thuan \\ dropbox \\ homework \\ css 342 \\ lab2 \\ lab2 \\ lab2 \\ lab2.lab26
3回复

复制构造函数问题Lippman

我试图解决一个副本ctro qs给出的唇膏n不确定如果我做对了。 由于课程有自己的指针,它让我有点困惑。 这是代码 它给出了分裂的错误。 我知道我也需要定义一个dtor,但首先我需要做到这一点。 我应该如何定义这样的类的复制ctor,赋值运算符? 谢谢
2回复

复制构造函数,对象,指针

假设我有这个: 并且solutionsList_是一个vector<SomeType*> vect* 。 复制该向量的正确方法是什么(我想那是我做错了..)?
3回复

复制构造函数问题

我正在尝试了解此副本构造函数问题。 程序退出后,我遇到的问题与析构函数有关。 似乎变量char *标题没有被破坏,我认为这可能是错误的,谢谢 另一个问题是为什么当对象x等于x2时不调用赋值运算符。 我正在使用带有代码块的g ++。
1回复

通用继承和复制构造函数

我创建了一个通用的Array类,然后使用通用的继承来创建一个NumericArray类。 当我使用默认的拷贝构造函数(在NumericArray中)时,我从成员函数中获得了正确的结果。 但是,当我在NumericArray类中实现自己的副本构造函数时,会得到错误的结果。 特别是,依赖于Nu
3回复

复制构造函数的问题

不要注意实际代码,只需阅读问题。 我有一个函数,它采用类型多项式的2个参数: 我的理解是,当p和irr被传递时,将调用Polynomial的复制构造函数。 复制构造函数正常工作,因为我可以通过最后的断点进行验证。 但为什么我得到实际参数p和irr的错误(未初始化)值。
2回复

复制构造函数省略?

我不太明白为什么在使用VC2010使用调试模式构建时不会调用此复制构造函数。 我认为这与RVO无关,因为我没有返回任何值。 更有趣的是,当我将复制构造函数设为私有时,即使编译器省略了复制构造函数,编译器也不会编译。