2012-02-04 151 views
0

刪除我需要一些幫助運營商newdelete運營商新的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; 
    } 

第一次讀是確定類,但第二個有此錯誤時,它要執行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.--- 

也有兩個按鈕和continue。
如果我按下去它表明我:

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

我不是很有經驗的指針(6個月)。我會很感激任何答案。

+0

您需要在長度上添加1以容納尾部'NUL'字符。或者使用'strdup()'或'std :: string'對象。 – trojanfoe 2012-02-04 08:16:57

+0

*注意:當你想使用大量的數據庫時,試試''NTL'庫http://www.shoup.net/ntl/ * – Vyktor 2012-02-04 08:18:16

+1

你不應該在這段代碼中使用指針。你應該使用'std :: vector'。我覺得我應該推薦你[一本好的入門C++書](http://stackoverflow.com/q/388242/46642)。 – 2012-02-04 08:20:11

回答

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 2012-02-04 14:23:11

1

由於您在使用C++而不是C,因此您可能需要使用string對象而不是char *。它們更容易使用。

雖如此,但此行顯得有點過我:

memset(buffer,'\0',maxlenght); 

在您不要將任何東西放入buffer事件中,strlen(buffer)結果將是零。因此,您的new語句將嘗試分配零個空間以用於零個元素。也許這是在這裏發生的?

+0

在這種情況下,'vector'可能比'string'更合適,因爲'char *'不是真正的文本。 – 2012-02-04 08:23:09

+0

好點。改用'vector '! – 2012-02-04 08:34:48

+0

我想爲我的C++經驗創建一個類,我不知道如何使用字符串,我會嘗試使用它們,感謝提示 – Vali 2012-02-04 14:27:09

1

傳遞給第二memset的長度是不正確的,它應該是:

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

錯陣列尺寸:

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

和析構函數被遺漏引起內存泄漏。 調用strlen(buffer)是非常昂貴的,應該被緩存。 std::string看起來更好然後char*