我正在开发自己的矢量实现,其中一个人在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&#;;”。
答案 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
一样安全。
这也适用于delete
和operator 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是完全正确的。