tags:

views:

156

answers:

5

Here is what I'm trying to do. I have a std::vector with a certain number of elements, it can grow but not shrink. The thing is that its sort of cell based so there may not be anything at that position. Instead of creating an empty object and wasting memory, I thought of instead just NULLing that cell in the std::vector. The issue is that how do I get pointers in there without needing to manage my memory? How can I take advantage of not having to do new and keep track of the pointers?

Thanks

A: 

If you're going to use pointers something will need to manage the memory.

It sounds like the best solution for you would be to use boost::optional. I believe it has exactly the semantics that you are looking for. (http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/index.html).

Actually, after I wrote this, I realized that your use case(e.g. expensive default constructor) is used by the boost::optional docs: http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/boost_optional/examples.html#boost_optional.examples.bypassing_expensive_unnecessary_default_construction

Anatoly Fayngelerin
The latest version is 1.44, by the way.
GMan
+3  A: 

How large are the objects and how sparse do you anticipate the vector will be? If the objects are not large or if there aren't many holes, the cost of having a few "empty" objects may be lower than the cost of having to dynamically allocate your objects and manage pointers to them.

That said, if you do want to store pointers in the vector, you'll want to use a vector of smart pointers (e.g., a vector<shared_ptr<T>>) or a container designed to own pointers (e.g., Boost's ptr_vector<T>).

James McNellis
My array is 3000 * 3000 * 100, its 3D
Milo
@Milo: So, an array of pointers isn't going to help you much, since 900 million pointers will occupy something around 3.6 gigabytes (assuming a 32-bit pointer size).
James McNellis
Indexes could also be invalidated just like memory addresses.
Anatoly Fayngelerin
@Anatoly: Good point. I had read the OP's statement that "it can grow but not shrink" as "elements won't be removed." But that's not what the OP said.
James McNellis
A: 

You can use a deque to hold an ever-increasing number of objects, and use your vector to hold pointers to the objects. The deque won't invalidate pointers to existing objects it holds if you only add new objects to the end of it. This is far less overhead than allocating each object separately. Just ensure that the deque is destroyed after or at the same time as the vector so you don't create dangling pointers.

However, based on the size of the 3-D array you mentioned in another answer's comment, you may have difficulty storing that many pointers. You might want to look into a sparse array implementation so that you mainly use memory for the portions of the array where you have non-null pointers.

ergosys
A: 

You could use a smart pointer. For example boost::shared_ptr.

David Feurle
A: 

The issue is that how do I get pointers in there without needing to manage my memory?

You can do certainly do this using the shared_ptr or other similar techniques mentioned here. But in near future you will come across some problem where you will have to manage your own memory. So please get yourself comfortable with the pointer concept.

Normally if you see in big servers the memory management of object itself is considered as a responsibility and specially for this purpose you will create a class. This is known as pool. Whenever you need an object you ask the pool to give you the object and whenever you are done with the object you tell the pool that I am done. Now it is the responsibility of the pool to see what can be done with that object.

But the basic idea is your main program still deals with pointers but do not care about the memory. There is some other object who cares about it.

Manoj R