Prolle
Prolle

Reputation: 61

Need help finding memoryleak

I have been sitting for hours now, and it's driving me nuts. Im new too c++ so if something else besides the memoryleaks is wrong I would love to know! :D

The thing is that if I make a new teacher/assistant/TA and print it I get:

{212} normal block at 0x005694B0, 8 bytes long.
 Data: <  V     > BC 91 56 00 00 00 00 00 
{210} normal block at 0x005691B8, 40 bytes long.
 Data: <      V Oliver  > BC A4 16 00 B0 94 56 00 4F 6C 69 76 65 72 00 CD 
{209} normal block at 0x00568F30, 8 bytes long.
 Data: <  V     > 90 8E 56 00 00 00 00 00 
{208} normal block at 0x00569468, 8 bytes long.
 Data: <d V     > 64 8E 56 00 00 00 00 00 
{204} normal block at 0x00568E60, 76 bytes long.
 Data: <    h V elev    > D4 A6 16 00 68 94 56 00 65 6C 65 76 00 CD CD CD 

If I keep repeting it just stacks up, would appreciate all the help I can get! :D

    int main(){



    int choise, count=0;
    bool ta = false , teacher = false, assistant = false;
    choise = meny();

    Employee **work = NULL;
    Employee **swapper = NULL;
    Employment *tmp = NULL;

    string name, types, subject, temp, type;
    int birthyear, salary, workhours, points;
    bool boss = false, ansvarig, key=false, cert;

    while (choise != NULL){
        if (choise > 0){

            if (choise == 1){
                fflush(stdin);
                cout << endl << "Namn: ";
                getline(cin, name);
                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                cin.ignore();
                cout << "\nTjänst: ";
                getline(cin, type);
                cout << "\nLon: ";
                cin >> salary;
                cin.ignore();
                cout << "\nChef: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    boss = true;
                }
                else
                    boss = false;
                cout << "\nTjanstgoringstid: ";
                cin >> workhours;
                cin.ignore();
                cout << "\nHuvudämne: ";
                cin >> subject;
                cin.ignore();
                cout << "\nProgramansvarig: ";
                cin >> temp;
                cout << "\n\n\n";
                cin.ignore();
                if (temp == "Ja" || temp == "ja")
                    ansvarig = true;
                else
                    ansvarig = false;



                count++;
                teacher = true;

            }
            else if (choise == 2){
                fflush(stdin);
                cout << endl << "Namn: ";
                getline(cin, name);

                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                fflush(stdin);

                cout << "\nTjänst: ";
                getline(cin, type);

                cout << "\nLon: ";
                cin >> salary;
                fflush(stdin);

                cout << "\nHuvudämne: ";
                cin >> subject;
                fflush(stdin);

                cout << "Avklarade poang: ";
                cin >> points;
                fflush(stdin);
                count++;

                assistant = true;
            }
            else if (choise == 3){

                fflush(stdin);

                cout << endl << "Namn: ";
                getline(cin, name);

                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                cin.ignore();

                cout << "\nTjänst: ";
                getline(cin, type);


                cout << "\nLon: ";
                cin >> salary;
                cin.ignore();

                cout << "\nTjanstgoringstid: ";
                cin >> workhours;
                cin.ignore();

                cout << "\nAttestratt: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    cert = true;
                }
                else
                    cert = false;

                cout << "\nHar huvudnyckel: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    cert = true;
                }
                else
                    cert = false;


                cout << "\n\n\n";




                count++;
                ta = true;
            }

            else if (choise == 4){
                for (int x = 0; x < (count); x++){
                    cout << work[x]->toString();
                }
            }
            if (choise != 0 && choise!=4){
                swapper = new Employee*[count];

                if (teacher == true){
                    tmp = new Teacher(type, boss, salary, workhours, subject, ansvarig);

                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                    teacher = false;

                    //delete tmp;
                }
                else if (ta == true){
                    tmp = new TA(type, boss, salary, workhours, cert, key);

                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                    assistant = false;

                //  delete tmp;
                }
                else if (assistant == true){
                    tmp = new Assistant(type, salary, subject, points);


                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                //  delete tmp;


                }



                    for (int x = 0; x < count - 1; x++){
                    swapper[x] = work[x];
                    }



                delete[] work;



                work = swapper;



            }

                choise = meny();




        }
    }

    /*for (int x = 0; x < count; x++){
        delete work[x];
        }*/

    delete [] work;



    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtDumpMemoryLeaks();

    return 0;

}

Upvotes: 0

Views: 59

Answers (3)

Lilshieste
Lilshieste

Reputation: 2754

Memory leaks occur whenever you dynamically allocate memory and do not release it. This means that for every new that appears in your program, a corresponding delete must exist or else you're leaking memory.

There are a lot of deletes that have been commented out in your code (e.g., for tmp). So, right off the bat, we know for sure those allocations are leaking.

Likewise the memory you're allocating for swapper isn't getting deallocated (at least the first time through the loop). Additionally, even though you invoke delete [] work, you aren't deleteing the individual elements in the array, which are also dynamically allocated.

And since all these allocations occur within a loop, it's no wonder that you have so many leaks!

Upvotes: 0

Rxmrtl
Rxmrtl

Reputation: 31

The thing is basically that for every new you make, you need to have a delete when the object is no longer needed. Doing this deallocate the memory. If you don't, you keep pilling up amounts of allocated memories forever and ever.

Upvotes: 0

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385295

You never delete your arrays. You should use vectors anyway.

Upvotes: 2

Related Questions