-
September 14th, 2010, 02:35 PM
#1
Unhandled exception..
"An unhandled exception of type 'System.AccessViolationException' occurred in Generator układów planetarnych.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
I have no idea what I did wrong. Weird is that error started occuring after a few succesfull runs when I added one more variable to print in console, but when I comment out latest change error still apears :/
When error occurs program is pointing for lines:
cout << this->name;
or
for(int j = 0; j < this->Satelite[i]->NoOfSatelites; i++)
Anyone has any clue?
Thanks in advance for help.
code:
#include "stdlib.h"
#include "math.h"
#include <string>
#include <iostream>
using namespace std;
using namespace System;
const double pi = 3.14159265;
enum ObjectType
{
None = -1,
Star = 0,
Planet = 1,
Moon = 2,
};
const string StrObjectType[] = {"Star", "Planet", "Moon"};
class StellarObject
{
public:
string name;
ObjectType type;
unsigned long mass;
unsigned short NoOfSatelites;
unsigned int GetMass() {return mass;}
string GetName();
__declspec(property(get = GetMass, put = SetMass)) unsigned int Mass;
__declspec(property(get = GetName, put = SetName)) string Name;
void PrintObject(unsigned short VertPos = 0, unsigned short HorPos = 0);
void PrintSystem();
StellarObject(Random^, bool);
StellarObject(Random^, bool, unsigned short Type = 0);
StellarObject** Satelite;
~StellarObject();
};
StellarObject::StellarObject(Random ^rnd, bool Satelites, unsigned short Type)
{
this->name = "aaa";
this->mass = 10;
this->type = (ObjectType)Type;
this->NoOfSatelites = 0;
Satelite = NULL;
if(Satelites && Type++ < 2)
{
this->NoOfSatelites = rnd->Next()%5 + 1;
this->Satelite = new StellarObject*[this->NoOfSatelites];
for(int i = 0; i < this->NoOfSatelites; i++)
{
Satelite[i] = new StellarObject(rnd, true, (ObjectType)Type);
}
}
}
void StellarObject::PrintObject(unsigned short VertPos, unsigned short HorPos)
{
int i = 0;
Console::SetCursorPosition(10 * i++ + HorPos, VertPos);
cout << this->name;
Console::SetCursorPosition(10 * i++ + HorPos, VertPos);
cout << StrObjectType[this->type];
Console::SetCursorPosition(10 * i++ + HorPos, VertPos);
cout << this->mass;
}
void StellarObject::PrintSystem()
{
int i = 0;
Console::SetCursorPosition(10 * i++,0);
cout << "Name";
Console::SetCursorPosition(10 * i++,0);
cout << "Type";
Console::SetCursorPosition(10 * i++,0);
cout << "Mass";
this->PrintObject(1);
unsigned short count = 2;
if(this->NoOfSatelites)
{
for(int i = 0; i < this->NoOfSatelites; i++)
{
this->Satelite[i]->PrintObject(count++, 1);
if(this->Satelite[i]->NoOfSatelites)
{
for(int j = 0; j < this->Satelite[i]->NoOfSatelites; j++)
{
this->Satelite[i]->Satelite[i]->PrintObject(count++, 2);
}
}
}
}
}
StellarObject::~StellarObject()
{
if(this->NoOfSatelites)
{
for(int i = 0; i < this->NoOfSatelites; i++)
{
if(this->NoOfSatelites)
{
for(int j = 0; j < this->Satelite[i]->NoOfSatelites; i++)
{
delete this->Satelite[i]->Satelite[j];
}
delete this->Satelite[i]->Satelite;
}
delete this->Satelite[i];
}
delete this->Satelite;
}
}
int main()
{
srand(time(0));
Random ^rnd = gcnew Random;
do{
StellarObject star (rnd, true, 0);
star.PrintSystem();
cin.get();
star.~StellarObject();
}while (true);
}
-
September 14th, 2010, 02:40 PM
#2
Re: Unhandled exception..
This is Managed C++, so you'll get more help in that forum. (Native C++ does not have a namespace "System", for one, nor does it use the ^ symbol in that way.)
However, I do find it suspicious that a j-based for loop is incrementing i instead of j.
-
September 14th, 2010, 03:07 PM
#3
Re: Unhandled exception..
-
September 14th, 2010, 03:21 PM
#4
Re: Unhandled exception..
I agree with Lindley about the i++ in that loop being suspicious.
It looks to me like in the loop where you're deleting your Satellite objects that since you're never incrementing j and incrementing i instead that you'll go into an infinite loop until it tries to delete something which doesn't exist... causing your crash. If you commented out that delete line, you'd probably find that it would just sit there looping forever instead of crashing.
Long story short: try a j++ in that for loop instead of an i++.
-
September 15th, 2010, 01:52 AM
#5
Re: Unhandled exception..
Originally Posted by Lindley
This is Managed C++, so you'll get more help in that forum. (Native C++ does not have a namespace "System", for one, nor does it use the ^ symbol in that way.)
However, I do find it suspicious that a j-based for loop is incrementing i instead of j.
I have tried to use * for pointer but I had problems with passing Random variable to function.
This is how I found it working.
i++ in j for loop it definitely my mistake.. but even after correction it does not solve the problem. Error still occurs on one of two lines I mentioned before.
-
September 25th, 2010, 06:49 PM
#6
Re: Unhandled exception..
Did you run in Debug-Mode?
I didn't programm C++ for a few years now, but I believe the Debugger should jump to the line where the exception is thrown, shouldn't it?
From there you should be able to inspect the contents of your variables and maybe use breakpoints to examine what goes wrong.
I can only recommend you to learn the debugger.
-
September 25th, 2010, 06:58 PM
#7
Re: Unhandled exception..
Your destructor looks pretty strange.
doesn't this work?
Code:
StellarObject::~StellarObject()
{
for(int i = 0; i < this->NoOfSatelites; i++)
{
// i suppose this should call the destructor and thus there
// is no need to walk through it's children and delete them
delete this->Satelite[i];
}
delete[] this->Satelite;
}
Same goes for your PrintSystem() Method. It's pretty weird.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|