Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 310
  • Last Modified:

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



0
marvinm
Asked:
marvinm
1 Solution
 
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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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
 
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

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now