使用' new'在模板类中类型安全吗?

时间:2018-05-25 09:29:32

标签: c++ vector

我正在开发自己的矢量实现,其中一个人在IRC上说,使用' new'在模板类中分配内存不是类型安全的。例如,在此代码中:

// resize array when needed
template <class T>
void myVector<T>::resize()
{
    vCapacity += 5;
    T* temp = new T[vCapacity]();

    for (unsigned i = 0; i < vCapacity; i++) temp[i] = vArray[i];

    delete [] vArray;
    vArray = temp;
    temp = nullptr;
}

这是真的吗?当我学习C ++时,没有人提到这一点,如果我没有弄错,当编译器编译模板类/函数时,它将用正确的类型替换“T&#;;”。

2 个答案:

答案 0 :(得分:0)

这不正确。 new向分配的内存返回"properly typed pointer",即T*。它与写new int一样安全。

但是,较为模糊的::operator new(与new不同)会返回void*,但可以静态转换为T*。即使这是类型安全的,只要你让它是类型安全的(不要尝试一些有潜在危险的东西,比如reinterpret_cast指针)。

此外,当您使用template <class T> vector实例化T并在T中一致地使用vector(分配,取消分配,指针算术......)时,只有涉及的一种类型 - T。它与使用显式类型(非泛型向量)编写整个vector一样安全。

这也适用于deleteoperator delete

您还有一个问题

  

当编译器编译此代码时,将会出现&#39; new&#39;为正确的类型分配内存空间?

是。它将为您提供的类型分配内存。如果您要求内存存储10x 32位int s,那么您将获得int*到320位内存的第一个int。如果你要求10x n位MyClass es,你将获得MyClass*到10n位内存中的第一个MyClass。这是一个很好的工作模式。

旁注:type是一种语言结构。它在内存中不存在。最接近的是通过不同指令(iadd,idivq,fadd,fdiv,...)的预期用途隐含地存在类型。但这有点超出了这一点(如果您对此感兴趣 - 请参阅汇编语言和处理器设计)。

答案 1 :(得分:0)

如果在int:

的向量上调用它,编译器将生成一些这样的临时函数
void myVector_int::resize()
{
  vCapacity += 5;
  int* temp = new int[vCapacity]();

  for (unsigned i = 0; i < vCapacity; i++) temp[i] = vArray[i];

  delete [] vArray;
  vArray = temp;
  temp = nullptr;
}

因此这实际上是一个正常的&#34;功能正常&#34;正常&#34;类型,使其完全类型安全。所以编译器用实际类型替换T是完全正确的。