Are pointers initialized to nullptr in a vector?

Started by
9 comments, last by SiCrane 11 years ago

class A{...};

int main()
{
	std::vector<A*> vec;
	vec.resize(10);
	std::cout<<(vec[9]==nullptr); //prints 1
}

?

?

?

I want to make sure this happens on every system.

Are pointers initialized to nullptr?

An invisible text.
Advertisement
I can't remember, but if you want to be 100% sure, you can do it explicitly:
vec.resize( 10, nullptr );

They should be default initialized to 0 or nullptr, yes.

If it's a vector of ints, then each element should be the same value as doing:


int myInt = int();
assert(myInt == 0);

(without the assert, which is just to illustrate)

For a vector of pointers, they should be initialized with their default constructor:


int *myIntPtr = /* however you're supposed to default-initialize them - I'm not sure */;


Test this:


#include <iostream>

typedef int *IntPointer; //Just so I get the initialization syntax correct.

int main(int argc, char *argv[])
{
    int intA; //Not garunteed to be initialized.
    int intB = int(); //Default initialized.
    
    std::cout << intA << " - " << intB << std::endl;
    
    int *intPtrA;
    int *intPtrB = IntPointer();
	
    std::cout << intPtrA << " - " << intPtrB << std::endl;
	
    return 0;
}

These will either output:

0 - 0
0 - 0

Or:

2293640 - 0 //The first value being whatever random piece of memory was left there, but the second still being 0.
0x35434 - 0x0


Depending on whether your compiler is default-constructing everything or not (sometimes done for debugging purposes to help catch mistakes).

std::vector::resize() - "If [the second argument is] not specified, the default constructor is used instead."

The default constructor for ints is 0 and for pointers is null (whether explicitly 0 or nullptr, I'm not sure, but it probably doesn't matter).

Also see this: http://stackoverflow.com/a/937257/1177073 , where someone actually quotes the standard.

Also, you should try to use vectors of objects, not vectors of pointers, unless you have a good reason not to. If you really do need pointers (say, because you are storing objects of different derived classes, to obtain polymorphism), you probably want to use a vector of unique_ptr.

Every element of a vector gets initialized with its default value, which is NULL for pointers.

So the basic answer is “Yes”.

L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

afaik the initial value is compiler related and not defined in standard. so you can't be sure 100%, but basically most compilers do it this way.

afaik the initial value is compiler related and not defined in standard. so you can't be sure 100%, but basically most compilers do it this way.

No, empty values in containers are value initialized, and value initialized primitive types (such as pointers, integers, floating point values and such) are required by the standard to have a zero value. This is different from default initialized values, which is undefined for primitive types.

ah, ok. thanks for correction.

Also, you should try to use vectors of objects, not vectors of pointers, unless you have a good reason not to. If you really do need pointers (say, because you are storing objects of different derived classes, to obtain polymorphism), you probably want to use a vector of unique_ptr.

boost::ptr_vector is here for that idiom.


Also, you should try to use vectors of objects, not vectors of pointers, unless you have a good reason not to. If you really do need pointers (say, because you are storing objects of different derived classes, to obtain polymorphism), you probably want to use a vector of unique_ptr.

boost::ptr_vector is here for that idiom.


My understanding is that boost::ptr_vector<blah> doesn't have any advantages over using std::vector<std::unique_ptr<blah>> now that we have move semantics. But I would love to learn something new, so please enlighten me.

This topic is closed to new replies.

Advertisement