2011-05-09 4 views
1

저는 Java 프로그래머입니다. 그러나 이제는 C++로 약간의 코드를 작성해야합니다. 2 년 전 C++의 기초를 배웠으므로별로 적합하지 않습니다.C++ malloc 오류

나는 다항식을 설명하는 작은 클래스를 썼다. 여기있다 :

#include "Polynom.h" 
#include <iostream> 

using namespace std; 

Polynom::Polynom() 
{ 
    this->degree = 0; 
    this->coeff = new int[0]; 
} 

Polynom::Polynom(int degree) 
{ 
    this->degree = degree; 
    this->coeff = new int[degree + 1]; 
} 

Polynom::~Polynom() 
{ 
    delete coeff; 
} 

void Polynom::setDegree(int degree) 
{ 
    this->degree = degree; 
} 

void Polynom::setCoeffs(int* coeff) 
{ 
    this->coeff = &*coeff; 
} 

void Polynom::print() 
{ 
    int i; 
    for(i = degree; i >= 0; i --) 
    { 
     cout<<this->coeff[i]; 
     if(i != 0) 
      cout<<"x^"<<i; 
     if(i > 0) 
     { 
      if(coeff[i - 1] < 0) 
       cout<<" - "; 
      else 
       cout<<" + "; 
     } 
    }  
} 

좋아, 지금은 정도와 다항식의 계수를 읽고 콘솔에 인쇄하려고 노력했다. 그 코드는 다음과 같습니다.

#include <iostream> 
#include "Polynom.h" 
using namespace std; 

int main() 
{ 
    int degree; 

    cout<<"degree = "; 
    cin>>degree; 
    int* coeff = new int[degree]; 
    int i; 
    for(i = 0; i <= degree; i++) 
    { 
     cout<<"coeff[x^"<<i<<"] = "; 
     cin>>coeff[i]; 
    } 
    Polynom *poly = new Polynom(degree); 
    //poly->setDegree(degree); 
    poly->setCoeffs(coeff); 
    cout<<"The input polynome is: "; 
    poly->print(); 
    return 0; 
} 

코드를 컴파일 할 때 모든 것이 정상입니다. 달릴 때 조차 준 다음 몇 가지 계수를 주면 프로그램이 정상적으로 실행됩니다. 그러나 : I (예 : 3 또는 5) 이상한 학위를 정의한 다음 계수를 제공하는 경우, 프로그램은 polynome를 인쇄하고 다음과 같은 오류를 반환하지 않습니다

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

왜 이런 일이 않습니다를? 배열에 대해 충분한 메모리를 할당하지 않은 위치는 어디입니까? 나는이 오류로 봤는데 this page을 우연히 발견했지만, 거기에 언급 된 해결책은별로 도움이되지 못했다.

내 코드에서 다른 문제가 발생할 수 있습니까? 나는 정말로 당신의 도움에 감사 할 것입니다.

미리 감사드립니다. 당신의 main() 기능에

+0

헤더 파일을 게시 할 수 있습니까? –

+2

소멸자에서'delete [] coeff'를 수행해야합니다. 또는 더 나은 방법은'std :: vector '을 사용하는 것인데 (이것은'degree' 멤버를 제거 할 것이다). –

+0

또한 삭제 폴리; –

답변

1

int *coeff = new int[degree] 당신에게 0에서 포함, degree-1에 이르기까지 다양한 요소의 인덱스와 길이 - degree 배열을 제공합니다. 루프에서 요소 0 ~ degree (포함)을 액세스하고 있습니다. 이것은 또는 런타임 오류가 발생하지 않을 수있다 정의되지 않은 동작, 등

+0

답장을 보내 주셔서 감사합니다. 참으로 그 지긋 지긋한 색인이었습니다. 오, 나는 학생 배지를 받았습니다. 저는 C++ 초보자입니다. 나는 프로그래밍을 시작할 때 몇 년 전에 느낀다. :-) – Darie

4
int* coeff = new int[degree]; 
int i; 
for(i = 0; i <= degree; i++) 

당신은 degree 요소에 대한 공간을 할당하고이 동작은 정의되지 degree+1 요소 ... 퍼팅입니다.

1

for 루프에있는 i <= degree 문이 원인입니다. 배열 색인은 0부터 시작하므로 유효한 범위는 0->degree-1입니다. 잘못된 메모리 위치에 쓰고 있으므로 프로그램이 예기치 않게 작동합니다.

12

코드에 막대한 금액이 있습니다. C++은 Java와 아무런 상관이 없습니다. 마치 포인터가 마치 Java에서 참조처럼 사용되는 것 같습니다.

Polynom::Polynom() 
{ 
    this->degree = 0; 
    this->coeff = new int[0]; 
} 

이렇게하면 크기가 0 인 배열을 만들 수 있습니다.이 배열은 C++에서는 적합하지만 거의 원하는 것은 아닙니다.이

Polynom::~Polynom() 
{ 
    delete [] coeff; 
} 

: C++에서

Polynom::~Polynom() 
{ 
    delete coeff; 
} 

배열은 삭제 []로 삭제해야합니다

void Polynom::setDegree(int degree) 
{ 
    this->degree = degree; 
} 

더 의미하지 않는다 - 당신이 정도를 변경,하지만 배열은이 연관되어 와.

void Polynom::setCoeffs(int* coeff) 
{ 
    this->coeff = &*coeff; 
} 

나는 이것이 어떤 생각을하고 있는지 전혀 모르겠다. 그리고 당신은 메모리 누수가 있습니다.

그건 처음 시작했을 때뿐이었습니다. Isuspect에는 훨씬 나쁜 것이 있습니다. 다음 두 가지 작업을 수행해야합니다.

  • C++에 대한 책 읽기. 프로그래밍 경험이 있으므로 Accelerated C++을 권장합니다.

  • Java 지식을 잊어 버리십시오. 내가 말했듯이 두 언어는 거의 공통점이 없습니다.

+0

+1은'delete []'에 +1합니다. – Naveen

+0

'this-> coeff = & * coeff;'... OP가하려고했던 것이 내부 포인터'coeff'를 새로운 주소로 설정했다고 의심합니다. 어떤 경우에는'this-> coeff = coeff;'가 좋을 것입니다. – Dennis