Search code examples
c++new-operatordelete-operator

Operators new and delete in c++


I need some help with operators new and delete

I tried to create a class named big to handle huge numbers

#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;
    }

The first read is ok but the second has this error when it want to execute 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.---

There are also two buttons Break and Continue.
If I press continue it shows me this:

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

I'm not very experienced with pointers (6 months). I would appreciate any answers.


Solution

  • Your fault occurs here:

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

    i.e. you've just resized your a pointer to, potentially, a smaller size, but, your maxlength variable still has the original size and can overwrite memory here. The patch would be:

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

    Also, I've used your mispelt maxlenght variable name. It should be maxlength.