Hi

After getting great help with my first post here I thought I would try again. I need to create a (dynamic) number of objects of two types, eggs and fry. I then need to be able to delete the fry and then make a new group of fry objects with all the info from the members of the egg objects (i.e. the egg objects will become the new fry objects). the number of objects will vary so I cannot just over write the old values. I have some code that actually works, but as the program exits a Windows error box appears. I am thinking some sort of memory problem but I am stumped. My code is:

#include <iostream>

#include <stdlib.h>

using namespace std;

#include "class1.hpp"

#include "class2.hpp"

int main()

{

Stage1 *eggs;

eggs = new Stage1[3];

for(int i=0;i<3;i++)

{

cout << "Egg number " << i << " Age " << eggs.getAge() << " Weight " << eggs.getWeight() << endl;

}

Stage2 *fry;

fry = new Stage2[3];

cout << endl;

for(int i=0;i<3;i++)

{

cout << "Fry number " << i << " Age " << fry.getAge() << " Weight " << fry.getWeight() << endl;

}

delete [] fry;

cout << endl;

for(int i=0;i<3;i++)

{

Stage2 *fry;

fry = new Stage2;

fry.setAge( eggs.getAge() );

fry.setWeight( eggs.getWeight() );

cout << "New Fry number " << i << " Age " << fry.getAge() << " Weight " << fry.getWeight() << endl;

}

cin.get();

return 0;

}

The header files are:

class1.hpp

//********************************************

class Stage1

{

public:

Stage1();

~Stage1();

int getAge() {return itsAge;}

void setAge (int Age) {itsAge = Age;}

int getWeight () {return itsWeight;}

void setWeight (int Weight) {itsWeight = Weight;}

protected:

int itsAge;

int itsWeight;

};

Stage1::Stage1():

itsAge(1),

itsWeight(5)

{

}

Stage1::~Stage1()

{

}

class2.hpp

//********************************************

class Stage2

{

public:

Stage2();

~Stage2();

int getAge() {return itsAge;}

void setAge (int Age) {itsAge = Age;}

int getWeight () {return itsWeight;}

void setWeight (int Weight) {itsWeight = Weight;}

protected:

int itsAge;

int itsWeight;

};

Stage2::Stage2():

itsAge(2),

itsWeight(9)

{

}

Stage2::~Stage2()

{

}

As I said, this works fine and I get the correct values, however on program exit I get an error box saying errors have been generated and the top of the log file looks like this:

Application exception occurred:

App: (pid=680)

When: 12/5/2003 @ 14:50:59.859

Exception number: c0000005 (access violation)

Please help

Fishman
PS I know this code could have been done better with derived or virtual classes but it is just to try to illustrate my problem

Dani AI

Generated

Short summary and practical fixes (for future readers)

The crash described by is classic undefined behavior from mixing scopes, allocations and deletes. The important rules to keep in mind: 1) match new[] with delete[] and new with delete; 2) don’t redeclare (shadow) a pointer name in an inner scope and assume it refers to the outer allocation; 3) avoid using unindexed/incorrect array access (use arr[i]), and 4) prefer containers so destruction/ownership is automatic.

Why your original code failed

  • Declaring Stage2 *fry again inside a loop shadows the outer fry pointer. You can end up leaking memory or calling delete[] on the wrong pointer later — both are undefined behavior and can crash at program exit.
  • Allocating a single object (new Stage2) but treating it like an array (or vice‑versa) produces mismatched allocation/deallocation and undefined behavior.
    ’s fix (moving allocations into one scope) eliminates the shadowing and made the crash go away, which is consistent with those causes.

A safer, modern approach
Replace raw arrays with a container and a small conversion constructor for copying data:

class Stage2 {
public:
  Stage2() = default;
  Stage2(const Stage1& s) : itsAge(s.getAge()), itsWeight(s.getWeight()) {}
  ...
};

std::vector<Stage1> eggs(noEggs);             // default-constructed Stage1 objects
std::vector<Stage2> fry;
fry.reserve(eggs.size());
for (const auto& e : eggs) fry.emplace_back(e); // copy fields safely

Troubleshooting tips

  • Reproduce under a debugger to see where the access violation happens.
  • Use tooling: MSVC runtime checks (/RTC), AddressSanitizer (clang/gcc), or Valgrind to find invalid reads/writes and double frees.
  • Compile with warnings and run in debug mode. If you must use new/delete, document ownership clearly and never shadow pointer names.

This keeps ownership explicit, avoids manual delete mistakes, and matches what found by concentrating allocations in one scope.

Recommended Answers

All 4 Replies

Hi Fishman, I believe I've seen you post this on another forum and had a response there already. Are you sorted now or still having a problem?

Hi Bob

Sorry if cross posting is frowned upon, my impatience got the better of me! I have not been able to log onto the other forum (I think their server is playing up) but have been trying to solve the problem on my own and think I have succeeded, at least I have some working code. I think the problem with the original was that I was creating objects in different scopes. The first batch of fry were made in the main function, the second batch were in curly brackets in an if loop. If I try to do all from the main function it all seems to work.

int noeggs = 5, nofry = 5;

Stage1 *eggs;
eggs = new Stage1[noeggs](5);
cout << "Eggs age is " << eggs[1].getAge() << endl;


Stage2 *fry;
fry = new Stage2[nofry](10);
cout << "Fry age is " << fry[1].getAge() << endl;
delete [] fry;
fry = new Stage2[noeggs](0);
cout << "new fry age is " << fry[1].getAge() << endl;

fry[1].setAge(eggs[1].getAge());
cout << "reset fry age is " << eggs[1].getAge() << endl;

This is a bit of code to show how I solved the problem, it illustrates how I now creata and destroy and re-create the objects in the main function and pass the egg ages to the fry. I will post the reply from the other forum when I can log on for others information and will not cross post in future.
fishman

oooops, last line should have read


cout << "reset fry age is " << fry[1].getAge() << endl;

Hi Bob

Sorry if cross posting is frowned upon, my impatience got the better of me!

No, there's no reason why you can't post to multiple sites. It's not a problem.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.