Reputation: 61
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
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 delete
s 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 delete
ing 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
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
Reputation: 385295
You never delete
your arrays. You should use vectors anyway.
Upvotes: 2