Re: How to free this memory?
On Jan 13, 10:07 am, "Paul" <pchrist<nospam>o...@yahoo.co.uk> wrote:
"Alf P. Steinbach" <alf.p.steinbach+use...@gmail.com> wrote in messagenew=
s:jepq5f$bvj$1@dont-email.me...
int main()
{
using namespace std;
struct TriVertex { double x, y, z; };
typedef vector<TriVertex> VertexVector;
typedef vector<VertexVector> VertexVectorVector;
VertexVectorVector vertices( 2 );
vertices[0].resize( 100 );
vertices[1].resize( 50 );
}
</code>
Hi Alf
Thanks for the extra tips.
As an additional discussion point , how would you pass, for example, a
pointer to a vertex as a function argument when using the vector method?
For example:
void example_function(trivertex* arg){};
example_function( vertices[0] ); /*No this won't convert to a pointer*/
If example_function needs a pointer, give it one. Any of these will
work, with a few caveats below.
example_function( & vertices[0][0] );
example_function( & vertices[0].front() );
example_function( vertices[0].data() ); // C++11 only
Caution: if vertices is empty, all of these give undefined behavior.
Else, if vertices[0] is empty, the first two of the above give
undefined behavior, and the third will probably give a pointer that
example_function will try to do something bad with, since it has no
'count' argument that could be specified as zero. And, if the
trivertex class overloads unary operator& [but who does?] the first
two of the above may possibly cause trouble. So be sure to check
those conditions first.
This is also assuming that example_function doesn't try to do anything
silly with the pointer it's given like realloc(), free(), etc.
(Note too that vector<bool> has a completely different implementation
from any other vector<T>, such that you cannot get a useful bool* from
it.)
I always feel I am entering dangerous territory when I start thinking abo=
ut
pointers to vector elements.
Not much to worry about: if you have a vector<T> where T is neither
bool nor has its own unary operator&, a pointer to a single vector
element can easily be acquired with & vec[index], and a pointer to the
first element obtained as above is guaranteed to give you a bunch of
objects that are contiguous in memory, just as if they were allocated
with operator new[]. (But beware of polymorphic objects... don't put
those in vectors.)
I am thinking of an iterator or something but I wonder if any iterator ty=
pe
will convert to a pointer, or perhaps using addressof operator &. How wou=
ld
you extract a pointer from the vector?
Generally vector<T>::iterator is a typedef for T* (except in the
special case vector<bool>), but this is not guaranteed (e.g. when
compilers have debugging turned on).
If you have only a vector<T>::iterator, AND you are sure it points to
a valid object (is not a one-past-the-end or singular iterator), AND
(yet again) T does not overload unary & and is not bool, you can get a
pointer from it via
vector<T>::iterator it = ...;
T * ptr = & * it;
- Kevin B. McCarty