2012-03-17 5 views
1

내 문제를 파생 클래스 복사 생성자로 좁혔지만 원인을 알 수 없습니다. 편집 : M, N 및 데이터는 비공개입니다. 내가받는 오류는 '유효하지 않은 할당 크기 : 4294967295 바이트'입니다. 이는 -1을 new로 전달할 때 발생합니다. 나는 클래스가 comunicate 때 데이터가 손실되지 않는 한 왜 이것이 발생하는지 확신 할 수 없다.잘못된 할당 크기 (파생 클래스 복사 생성자에서)

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy) 
{ 
    //cout << "Copy Constructor\n"; 

    M = copy.M; 
    N = copy.N; 

    data = new double[M*N]; //This line causes the allocation error 

    for (int i = 0; i < M; i++) 
    { 
      for (int j = 0; j < N; j++) 
      { 
        data[i*N+j] = copy.data[i*N+j]; 
      } 
    } 
} 

위의 내용은 오류의 원인이되는 파생 된 복사 생성자입니다. 나는 할당 선을 표시했다.

M 및 N이 올바르게 읽히지 않는다고 가정 할 수 있습니다. 비록 내가 왜 확신 할 수는 없지만. 파생 및 기본 생성자와 기본 복사본을 모두 포함합니다.

어떤 도움을 주셔서 감사합니다.

MATRIX (BASE) 생성자

Matrix::Matrix(int M, int N, double* input_data) 
{ 
    this->M = M; 
    this->N = N; 

    //cout << "Matrix Constructor\n"; 
    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
      for (int j = 0; j < N; j++) 
      { 
        data[i*N+j] = input_data[i*N+j]; 
      } 
    } 

    delete [] input_data; 
} 

MATRIX (BASE)는 생성자

Matrix::Matrix(const Matrix& copy) 
{ 
    //cout << "Copy Constructor\n"; 

    M = copy.M; 
    N = copy.N; 

    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      data[i*N+j] = copy.data[i*N+j]; 
     } 
    } 
} 

BINARYMATRIX (파생 됨) 생성자에게 COPY

BinaryMatrix::BinaryMatrix(int M, int N, double* input_data) : Matrix(M, N, input_data) 
{ 
    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      this->data[i*N+j] = this->getRead(i, j); 
     } 
    } 

    double thr_val = this->Mean(); 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      if (this->data[i*N+j] > thr_val) 
       this->data[i*N+j] = 1; 

      if (this->data[i*N+j] < thr_val) 
       this->data[i*N+j] = 0; 
     } 
    } 
} 
+0

오류가 무엇입니까? – Castilho

+0

Doh - 죄송합니다. 이제 주 질문으로 편집하겠습니다. – LBHoward

+0

이 런타임 오류 또는 컴파일 시간 오류가 있습니까? – je4d

답변

0

만약 MNMatrix에 개인이며, BinaryMatrix 나는 당신의 코드 컴파일이 (당신이 BinaryMatrix에서 M, N에 액세스 할 수 없게한다) 이유를 잘 모르겠습니다, Matrix에서 유래. BinaryMatrix 선언에 MN (및 Matrix::NMatrix::M도 포함) 멤버가 포함되어있는 경우 문제의 원인 일 수 있습니다.

BinaryMatrixMN으로 선언되지 않으면 문제를 진단 할 수있는 충분한 데이터가없는 것 같습니다. 아마도 M * N은 M에 사용 된 유형에 맞지 않습니다. 따라서 산술 오버 플로우가 발생합니다. 배열 크기는 size_t으로 지정되므로 캐스트가 정상적으로 작동합니다.

또한 데이터 관리를 클래스 중 하나에 위임하려고합니다.

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy) 
{ 
    // M, N, data already set in Matrix::Matrix(const Matrix&) 
    // The data has also been copied, so there is nothing to do here. 
} 

나이 : 그 중 하나가이 작업을 수행한다

#include <algorithm> 

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) 
: Matrix(), M(0), N(0), 
    data(0) // null in case new throws an exception (avoid bad delete in dtor). 
{ 
    const size_t nelems(size_t(copy.M)*size_t(copy.N)); 
    data = new double[nelems]; 
    M = copy.M; 
    N = copy.N; 
    stl::copy(copy.data, copy.data+nelems, data); 
} 

나는 아무것도 보장하지 않기 때문에 동적 데이터 구조의 반복에 대한 int를 사용하는 것은 좋지 않습니다 일반적으로 생각하는 실제 크기가 의 구조는 int에 맞습니다. 즉, 보장은 (기존의 객체가 size_t의 크기 표현할 수 있어야합니다, 그래서 당신은 size_t를 사용하는 연속 객체를 반복 할 수 있습니다) size_t위한 그러나 존재한다.

실제로, 나는 (목적이나 행동의) 구별이 MatrixBinaryMatrix에서 얻으려는 것이 확실하지 않습니다. 데이터에는 동일한 표현이있는 것 같습니다. 그것은 행동의 차이가 있지만, 당신이 찾고있는없는 표현 인 경우, 나는 오히려 상속보다 (즉, 별도의 취소 상속 표현 클래스이다) 구성을 사용하는 것이 더 좋을 것 같아요. 유용하게 상속을 사용하는 경우에 대한 생각하는 방법에 대한 설명은 What is the Liskov Substitution Principle?를 참조하십시오. 당신의 문제를 보여줍니다 작은 완벽한 예제 프로그램은 무엇인가 : 당신이 지금까지 실제로 본 답변의 방법들로 문제를 해결하는 데 도움이없는 경우

그러나, 당신은 당신의 예를 자르고에 시간을 넣어해야합니까? 그걸 게시해라.

+0

우수합니다. 도움을 주셔서 감사합니다. 이것은 나에게 상속과 배분에 대한 더 깊은 이해를주었습니다. :) – LBHoward

+0

답변을 추가로 확장 해 주셔서 감사합니다. 개인적으로 저는이 경우 상속의 시점을 보지 못합니다. 그것은 가능한 가장 추상적 인 방법으로 당신에게 뭔가를 가르쳐 준 Uni 과제 중 하나입니다. 클래스는 매우 다르게 동작합니다. 이진수는 1과 0 만 허용하지만이 데이터를 보유하려면 여전히 이중을 사용합니다. 매우 비천합니다. 또한 0에서 255 사이의 데이터를 정규화하는 그레이 스케일을 포함시켜야합니다. 그러나이 문제를 해결할 수있는 충분한 정보가 제공되었습니다. Matrix (기본)가 이미 수행 한 작업을 다시 정의 할 필요가 없었습니다. – LBHoward

+0

대신 단순히 바이너리 정상화/변환을 수행하기 위해 파생 된 방법을 사용할 수 있습니다. Protected 유형을 사용하는 rerun의 제안에 따라 가능합니다. – LBHoward

0

M과 N이 비공개 인 경우 오류가 발생합니다. 보호 수준을 보호 또는 공용으로 변경하거나 액세스 방법을 제공해야합니다. 비공개 인 기본 클래스에 정의 된 Vairables는 파생 클래스에 쉽게 접근 할 수 없습니다.

class A 
{ 
    int x; 
} 

class B : public A 
{ 
    int DoSomething() 
    { 
     return x; //This is an error X is private to class A and as such inaccessible. 
    } 

} 
1

은 왜 BinaryMatrix 복사 생성자의 행렬 데이터의 새 복사본을 만들려면 어떻게해야합니까? 복사 생성자 BinaryMatrix에서 호출 한 Matrix의 복사 생성자가 이미이 작업을 수행합니다.

BinaryMatrix 복사 생성자에서 복사 생성자 Matrix (이미 복사 된 행렬 데이터) 복사본을 버리고 새 복사본을 만듭니다. 이것은 메모리 누수입니다. 메모리를 자주 사용하면 메모리가 고갈됩니다.

관련 문제