2012-02-04 4 views
0

에서 삭제 나는 엄청난 수사업자 새로운 C++

#include <iostream> 
using namespace std; 

class big 
{ 
protected: 
    char *a; 
    long lenght,maxlenght; 
public: 
    big() 
    { 
     maxlenght=256; 
     a=new char[maxlenght]; 
     memset(a,'\0',maxlenght); 
    } 
    void read(); 

    void set_maxlenght(long x); 

    long msize(); 

    long size(); 

    char* return_big(); 

    long at(long poz); 

    char* operator[](long poz); 

    void operator=(big x); 

    void modify (long poz,long val); 

    void dec (long poz); 

    void inc (long poz); 

    void operator-(big x); 

    int compare(big x); 
}; 




//functions 

void write(big x) 
{ 
    char *ptr; 
    ptr=x.return_big(); 
    cout<<ptr; 
} 


//class big 

    void big::read() 
    { 
     char *buffer; 
     buffer=new char[maxlenght]; 
     memset(buffer,'\0',maxlenght); 
     cin>>buffer; 
     delete[] a; 
     a=new char[strlen(buffer)]; 
     memset(a,'\0',maxlenght); 
     for(long i=0;i<(long)strlen(buffer);i++) 
      a[i]=buffer[i]; 
     lenght=strlen(buffer); 
     delete[] buffer; 
    } 

    void big::set_maxlenght(long x) 
    { 
     maxlenght=x; 
    } 

    long big::msize() 
    { 
     return maxlenght; 
    } 

    long big::size() 
    { 
     return lenght; 
    } 

    char* big::return_big() 
    { 
     char *x; 
     x=a; 
     return x; 
    } 

    long big::at(long poz) 
    { 
     if(poz>=lenght) 
      return -1; 
     else 
      return this->a[poz]; 
    } 

    char* big::operator[](long poz) 
    { 
     if(poz>=lenght) 
      return NULL; 
     else 
      return a+poz; 
    } 

    void big::operator=(big x) 
    { 
     a=new char[x.size()]; 
     for(long i=0;i<(long)strlen(x.a);i++) 
      this->modify(i,x.at(i)); 
     this->lenght=strlen(x.a); 
    } 

    void big::modify (long poz,long val) 
    { 
     a[poz]=(char)val; 
    } 

    void big::dec (long poz) 
    { 
     if(a[poz]) 
      a[poz]--; 
    } 

    void big::inc (long poz) 
    { 
     if(a[poz]<255) 
      a[poz]++; 
    } 

    void big::operator-(big z) 
    { 
     long n,m,i,j,aux; 
     big rez,x,y; 
     if(compare(z)) 
     { 
      x=*this; 
      y=z; 
     } 
     else 
     { 
      y=*this; 
      x=z; 
     } 
     n=x.size(); 
     m=y.size(); 
     i=n; 
     j=m; 
     while(j>=0) 
     { 
      if(x.at(i)<0) 
      { 
       x.modify(i-1,x.at(i-1)+x.at(i)); 
       x.modify(i,0); 
      } 
      aux=x.at(i)-y.at(j); 
      if(aux<0) 
      { 
       x.dec(i-1); 
       rez.modify(i,aux+10); 
      } 
      else 
       rez.modify(i,aux); 
     } 
     while(i) 
     { 
      i--; 
      if(x.at(i)<0) 
      { 
       x.modify(i-1,x.at(i-1)+x.at(i)); 
       x.modify(i,0); 
      } 
      rez.modify(i,x.at(i)); 
     } 
    } 

    int big::compare(big x) 
    { 
     return strcmp(this->a,x.return_big()); 
    } 

    int main() 
    { 
     big a,b; 
     a.read(); 
     b.read(); 
     write(a); 
     endl(cout); 
     write(b); 
     return 0; 
    } 

첫 번째 읽기 괜찮 처리 할 큰라는 이름의 클래스를 만들려고 사업자 newdelete

와 도움이 필요하지만, 두 번째는있다 이 a=new char[strlen(buffer)]을 실행하려면이 오류 :

---Windows has triggered an error in MyProject.exe 

This may be due to the corruption of the heap, which indicates a bug in MyProject.exe or any DLLs it has loaded. 
This may also be due to the user pressing F12 while MyProject.exe has focus. 
The output window may have more diagnostic information.--- 

는 두 개의 버튼이 휴식하고 계속있다. 나는 계속 누르면
그것은 나에게 보여줍니다이 : 나는 매우 포인터 (6 개월) 경험 아니에요

Unhandled exception at 0x77b8380e in Olimpiada a IX-a.exe: 0xC0000374: A heap has been corrupted. 

. 나는 어떤 대답을 주셔서 감사합니다.

+0

뒤의'NUL' 문자를 수용하려면 길이에 1을 더해야합니다. 또는'strdup()'또는'std :: string' 객체를 사용하십시오. – trojanfoe

+0

* 참고 : 큰 숫자로 작업하려면 'NTL'과 같은 라이브러리를 사용하십시오. http://www.shoup.net/ntl/ * – Vyktor

+1

이 코드에서 포인터를 사용하면 안됩니다. 'std :: vector'를 사용해야합니다. 나는 당신에게 [좋은 입문 C++ 책] (http://stackoverflow.com/q/388242/46642)을 추천해야하는 것처럼 느낀다. –

답변

1

당신의 잘못이 여기에 발생

delete[] a; 
a=new char[strlen(buffer)]; 
memset(a,'\0',maxlenght); 

당신은 단지에 대한 포인터를 크기를 조정 한 즉, 잠재적으로 더 작은 크기 일 수도 있지만 maxlength 변수는 여전히 원래 크기를 가지며 여기에 메모리를 덮어 쓸 수 있습니다. 패치는 다음과 같습니다.

delete[] a; 
maxlength = strlen(buffer); 
a=new char[maxlenght]; 
memset(a,'\0',maxlenght); 

또한 mispelt maxlenght 변수 이름을 사용했습니다. maxlength 여야합니다. 두번째 라인에

+0

예. 내 잘못이 아니므로 maxlenght를 고맙게 생각합니다. 대답 – Vali

1

C가 아니기 때문에 C가 아니라 char * 대신 string 개체를 사용하려고 할 수 있습니다. 그들은 사용하기가 훨씬 쉽습니다.

그러나 그렇게 말한다면,이 라인은 나에게 떨어져 조금을 보았다 :

당신이 buffer에 아무것도 넣지 않는 경우에
memset(buffer,'\0',maxlenght); 

, strlen(buffer)의 결과는 0이됩니다. 따라서 new 문은 char 개의 요소에 공백을 할당하려고 시도합니다. 아마도 여기서 일어난 일일까요?

+0

이 경우'char'는 실제 텍스트가 아니기 때문에'vector'가'string'보다 더 적합 할 것입니다. –

+0

좋은 지적. 대신에 '벡터 '을 사용하십시오! –

+0

내 C++ 경험을위한 클래스를 만들려고했는데 문자열을 잘 사용하는 방법을 잘 모릅니다. 힌트를 주려고합니다. – Vali

1

두 번째 memset 함수에 전달 된 길이를 잘 작성하지, 그것은해야한다 :

memset(a,'\0',strlen(buffer)); 
0

잘못된 배열 크기 :

a=new char[strlen(buffer)]; 
memset(a,'\0',maxlenght); 

소멸자는 메모리 누출을 야기하는 누락된다. strlen(buffer)의 전화는 매우 비싸기 때문에 캐시해야합니다. std::string 다음은 char*이 좋습니다.