Vali Rosca
Vali Rosca

Reputation: 438

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.

Upvotes: 0

Views: 1054

Answers (4)

Valerij
Valerij

Reputation: 79

Wrong array size on second line:

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

And destructor is missed that causes memory leaks. Calls of strlen(buffer) are very expensive and should be cached. std::string looks better then char*.

Upvotes: 0

Stephen Quan
Stephen Quan

Reputation: 26309

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.

Upvotes: 1

Eelke
Eelke

Reputation: 22043

The length passed to the second memset isn't right, it should be:

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

Upvotes: 1

Alex Reynolds
Alex Reynolds

Reputation: 96984

Since you're doing C++ and not C, you might instead want to use the string object instead of char *. They are a lot easier to use.

But that said, this line looked a bit off to me:

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

In the event that you don't put anything into buffer, the result of strlen(buffer) will be zero. As a result, your new statement will try to allocate space for zero char elements. Perhaps that's happening here?

Upvotes: 1

Related Questions