iterator question

I have a program that compiles and runs fine under MS VS6, but gets compiler errors with .NET.  I just wanted to know the difference between 2 statements.

I declare a vector
typedef vector<MyClass*>MyClassArray;
MyClassArray MyClassVar;
then an iterator
MyClassArray::iterator ppMyClass;
for (ppMyClass=MyClassVar.begin(); ppMyClass!=MyClassVar.end(); ppMyClass++) {
// .. do some things
      return ppMyClass; // this works in vs6, but error in .net
}

.Net accepts
        return &(*ppMyClass);

any insight would be appreciated
Thank You



LVL 1
marvinmAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

tinchosCommented:
The problem is that you're returning an iterator to a local variable......

This is like returning a pointer to a local array (An iterator could be considered as a pointer to an element of the vector).

when you make

void function()
{
   MyClassArray MyClassVar;
   MyClassArray::iterator ppMyClass;
}

The myClssVar is a local variable, so it is stored in the stack...........
when the function exits, all the stack is released.....

so, if you return an iterator (or let's say a pointer), you're referencing memory that after the function exits, is not going to be available

This is why I believe that .net is giving an error. (I believe that MsVC6 didn't take this as an error).

Hope it's clear enough

Tincho

0
tinchosCommented:
It depends in your code, but a way of solving this is passing the array as a parameter to the function, so it will be available even after the function exits....

A way of solving this is......

MyClassArray::iterator function( MyClassArray & MyClassVar )
{
  MyClassArray::iterator ppMyClass;

  // Your code

  return ppMyClass;
}

and you would call it like this


MyClassArray MyClassVar;
MyClassArray::iterator ppMyClass = function( MyClassVar );
0
marvinmAuthor Commented:
that makes sense, but leads to my next question...
what should I be returning?  What I am looking for is to get the address of the pointer to MyClassVar item in the vector, which is what I was treating the iterator value as.
Thank You
0
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

tinchosCommented:
I'm not sure if you read my last post...........

You can return an iterator, but there are two ways of solving it

one way is to pass a reference to the array as a parameter (like I said)

another way would be to allocate the array in the heap
MyClassArray *MyClassVar = new MyClassArray();

and in this case you won't have problem in returning iterators to the array.....
(as the array is stored in the heap, it won't get destroyed when the function exits)........



Finally, I just wanted to add that if I were you I would choose the solution in the previous post, as you won't have problem in freeing the memory allocated with new (which you will have if you use this second possibility)
0
marvinmAuthor Commented:
sorry, I posted my followup before refreshing the browser window.  I will look into
doing this with our complete app and either post followup questions or grade your response.
Thank You
0
tinchosCommented:
Ok, just let me know marvinm
0
rstaveleyCommented:
Returning &(*ppMyClass), returns a the address of the object referenced by the iterator (and would cause a problem if the iterator was MyClassVar.end()).

Returning ppMyClass, simply returns the iterator and would not cause a problem if the iterator was MyClassVar.end().

They are not the same.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
havman56Commented:
see ur STL of vs6 and .net they are different STL library i guess...
0
marvinmAuthor Commented:
tinchos, thank you for your help as well.
rstaveley's comment pointed me more in the correct direction though.
Thank You
0
tinchosCommented:
Ok marvinm, glad you could solve your problem
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.