Solved

iterator question

Posted on 2003-10-22
10
302 Views
Last Modified: 2013-12-14
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
Comment
Question by:marvinm
10 Comments
 
LVL 9

Expert Comment

by:tinchos
ID: 9600757
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
 
LVL 9

Expert Comment

by:tinchos
ID: 9600785
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
 
LVL 1

Author Comment

by:marvinm
ID: 9600811
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
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.

 
LVL 9

Expert Comment

by:tinchos
ID: 9600884
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
 
LVL 1

Author Comment

by:marvinm
ID: 9600967
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
 
LVL 9

Expert Comment

by:tinchos
ID: 9601001
Ok, just let me know marvinm
0
 
LVL 17

Accepted Solution

by:
rstaveley earned 50 total points
ID: 9601198
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
 
LVL 4

Expert Comment

by:havman56
ID: 9606021
see ur STL of vs6 and .net they are different STL library i guess...
0
 
LVL 1

Author Comment

by:marvinm
ID: 9614695
tinchos, thank you for your help as well.
rstaveley's comment pointed me more in the correct direction though.
Thank You
0
 
LVL 9

Expert Comment

by:tinchos
ID: 9614728
Ok marvinm, glad you could solve your problem
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
installing and using WTP plugin eclipse MARS 3 124
SNMP error No Such Object available on this agent at this OID 3 297
Syntax Error 2 77
Gaming Software 1 18
Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

807 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question