我想了解一些关于动态内存的内容:new和delete for class template如下所示。
我有一些类模板(由内部开发的)定义的类模板定义 类模板如下。
template <class DAT, class IDX, int ENTRYMX=0x20, int SUBMX=34, int bsz=8>
class HashTable : public public HashTableIn
{
HashTable ()
: HashTableIn(ENTRYMX),
...
...
...
}
在我的代码中,我使用该模板类的对象:
mpRt = new HashTable<data_st,index_st>;
我明确删除了这个mpRt(我知道智能指针......但是目前它们并没有在这个遗留代码中使用,所以让我们把它们留下来)
delete mpRt;
我的问题: 我想知道我是否必须这样做
delete [] mpRt
because the class template has a default argument of ENTRYMX = 0x20
答案 0 :(得分:2)
我想知道我是否必须
delete [] mpRt
不,您按mpRt
分配operator new
,然后致电delete mpRt;
您必须成对呼叫new/delete
和new [] /delete[]
。
如果您使用ENTRYMX
内的HashTable
来new[]
动态分配内存,则需要在delete[]
内调用HashTable
来解除分配。另外,请不要忘记关注Rule of Three.
答案 1 :(得分:2)
来自标准:
5.3.4新[expr.new]
8 /如果分配的类型是非数组类型,则分配函数的名称为
operator new
,并且释放函数的名称为operator delete
。如果分配的类型是数组类型,则分配函数的名称为operator new[]
,释放函数的名称为operator delete[]
。
new
始终带有delete
。
new []
始终带有delete []
。
在您的情况下,mpRt
与operator new
一起分配,您必须使用delete
取消分配。
答案 2 :(得分:1)
你为什么这样? mpRt
不是使用new[]
分配的数组。
它可能包含一个数组(提示参数名称为ENTRYMX
),但mpRt
本身不是数组类型。与此数组相关的内存管理是类的内部管理,而不是创建此类对象的代码的责任。
经验法则:将new
与delete
匹配,将new type[]
与delete []
匹配。
答案 3 :(得分:1)
不,总是在对中使用new / delete和new [] / delete []。因此,如果您没有明确使用new []
,请不要使用delete []