This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Help with STL


Hi all!

I'm quite puzzled by this, perhaps one of the gurus on the list might
be able to help ;)

I have this member function inside a class:


calc_atom_forc(Atom_Classical *atm, std::list<Atom_Classical*> *neighbours)


Where the Atom_Classical object is essentially a struct holding data
plus a few member functions. The neighbours pointer points to a
std::list of pointers to Atom_Classical objects that are stored
outside this class.

Now situation "A". Let's say that right upon entering the
calc_atom_forc routine, I run this loop:

calc_atom_forc(Atom_Classical *atm, std::list<Atom_Classical*> *neighbours)
{
    for ( std::list<Atom_Classical*>::iterator a =
neighbours->begin(); a != neighbours->end(); a++)
    {
        cout << (*a)->x() << endl;
    };
}

This will work fine, and the program will print the value returned by
the x() function of each Atom_Classical object. So far so good.

Now we get into situation B. I need to manipulate a bit those
pointers. This is the idea:
calc_atom_forc(Atom_Classical *atm, std::list<Atom_Classical*> *neighbours)
{
        //Allocating a vector that will hold the guys we need to
change inside this routine
	std::vector<Atom_Classical> changed_atms;

	for (std::list<Atom_Classical*>::iterator neigh =
neighbours->begin(); neigh != neighbours->end(); neigh++)
	{	
               If ( criteria_that_does_not_matter_now == true)
               {
                        //Pushing a copy of the original
Atom_Classical pointed by iterator neigh into the changed_atms vector:
                        changed_atms.push_back( *(*neigh) );
                        //Printing debug info:
                        cout << "Before changing atom " <<
(*neigh)->id() << " we had: " << (*neigh)->posi() << endl;

                        //Removed here some code that would change the
data on the "changed_atms[changed_atms.size() -1]" object

			//Now we'll make the corresponding neigh pointer point to the
modified atom on the newly created changed_atoms vector, instead of
the atom in the original neighbours list:
			(*neigh) = &(changed_atms[changed_atms.size() -1]);
                        //Printing debug info:
                        cout << "After changing atom " <<
(*neigh)->id() << " we have: " << (*neigh)->posi() << endl;
		};
	};
}

This also works fine. So in situation B, I'm having some of the
pointers pointed by the neighbours list point to the objects inside
the changed_atms container I've created inside this function. Notice
that the neighbours list is not allocated inside this function, all I
have is a pointer to it. I know that when the function ends, the
original neighbours list will have invalid pointers. That does not
matter, because that list will be deleted as soon as this routine
ends.

Here comes the trouble. What I need to do is run situation B, then
situation A. If I do this, I get a segfault error. This is how it's
like:

calc_atom_forc(Atom_Classical *atm, std::list<Atom_Classical*> *neighbours)
{
	// START OF CODE FROM SITUATION B, IDENTICAL TO THE ONE SHOWN PREVIOUSLY:

        //Allocating a vector that will hold the guys we need to
change inside this routine
	std::vector<Atom_Classical> changed_atms;

	for (std::list<Atom_Classical*>::iterator neigh =
neighbours->begin(); neigh != neighbours->end(); neigh++)
	{	
               If ( criteria_that_does_not_matter_now == true)
               {
                        //Pushing a copy of the original
Atom_Classical pointed by iterator neigh into the changed_atms vector:
                        changed_atms.push_back( *(*neigh) );
                        //Printing debug info:
                        cout << "Before changing atom " <<
(*neigh)->id() << " we had: " << (*neigh)->posi() << endl;

                        //Removed here some code that would change the
data on the "changed_atms[changed_atms.size() -1]" object

			//Now we'll make the corresponding neigh pointer point to the
modified atom on the newly created changed_atoms vector, instead of
the atom in the original neighbours list:
			(*neigh) = &(changed_atms[changed_atms.size() -1]);
                        //Printing debug info:
                        cout << "After changing atom " <<
(*neigh)->id() << " we have: " << (*neigh)->posi() << endl;
		};
	};

       // END OF CODE FROM SITUATION B.
       // START OF CODE FROM SITUATION A, IDENTICAL TO THE ONE SHOWN PREVIOUSLY:

       for ( std::list<Atom_Classical*>::iterator a =
neighbours->begin(); a != neighbours->end(); a++)
       {
            cout << (*a)->x() << endl;   --> Program crashes upon
reaching this line for the first time.
       };

       // END OF CODE FROM SITUATION A.
}

What is so strange here is that I can test the code in part B, and
it's working (I can see it through the couts on the screen). Then I
get on part A and get a segfault while accessing the same list that
had worked fine just a few lines before.

What's wrong here?

Thank you very much!

Giovani Faccin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]