初始化向量中的指针

时间:2014-09-18 04:00:57

标签: c++ pointers vector initialization

我正在尝试将vector中的所有指针初始化为NULL。 基于线程: initialize vector of pointers (automatically)How to initialize a vector of pointers

我可以使用向量构造函数来实现我想要的。我的问题是:初始化NULL指针是标准行为吗?或者某些编译器中的向量中的指针可能不是NULL? 如果初始化为NULL是标准的,有人可以告诉我在哪个章节可以找到c ++标准中的相关信息吗?

谢谢,

1 个答案:

答案 0 :(得分:6)

我认为你的意思是这样的:

std::vector<MyClass*> v(10);

是的,使用空指针初始化向量。按章和节引用标准有点涉及......

C ++14§23.3.6.2“向量构造函数,复制和赋值”:

  

explicit vector(size_type n, const Allocator& = Allocator());

     

效果:使用指定的分配器构造vector n个默认插入元素。

     

要求: T DefaultInsertable*this

§23.2.1“一般容器要求”¶13:

  

- T DefaultInsertable 进入X意味着以下表达式格式正确:

allocator_traits<A>::construct(m, p)
     

- X的元素默认插入如果通过评估表达式初始化

allocator_traits<A>::construct(m, p)
     

其中pX内分配的元素的未初始化存储的地址。

§20.7.8.2“分配器特征成员函数”¶5:

template <class T, class... Args>
  static void construct(Alloc& a, T* p, Args&&... args);
     

效果:如果调用格式良好,则调用a.construct(p, std::forward<Args>(args)...);否则,调用::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)

§20.7.9.1“[默认] allocator成员”¶12:

template <class U, class... Args>
  void construct(U* p, Args&&... args);
     

效果: ::new((void *)p) U(std::forward<Args>(args)...)

回到§23.2.1¶13,看到args为空。因此...

§8.5“初始化者”:

  

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。

相同部分:

  

value-initialize 类型为T的对象意味着:...否则,该对象将被初始化为零。

相同部分:

  

零初始化类型T的对象或引用意味着:...如果T是标量类型(3.9),则将对象初始化为获得的值将整数文字0(零)转换为T; 106

脚注106:

  

如4.10中所述,将值为0的整数文字转换为指针类型会产生空指针值。