C ++删除操作相关查询

时间:2013-08-21 10:06:48

标签: c++ class templates delete-operator

我想了解一些关于动态内存的内容: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

4 个答案:

答案 0 :(得分:2)

  

我想知道我是否必须delete [] mpRt

不,您按mpRt分配operator new,然后致电delete mpRt;您必须成对呼叫new/deletenew [] /delete[]

如果您使用ENTRYMX内的HashTablenew[]动态分配内存,则需要在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 []

在您的情况下,mpRtoperator new一起分配,您必须使用delete取消分配。

答案 2 :(得分:1)

你为什么这样? mpRt不是使用new[]分配的数组。

它可能包含一个数组(提示参数名称为ENTRYMX),但mpRt本身不是数组类型。与此数组相关的内存管理是类的内部管理,而不是创建此类对象的代码的责任。

经验法则:将newdelete匹配,将new type[]delete []匹配。

答案 3 :(得分:1)

不,总是在对中使用new / delete和new [] / delete []。因此,如果您没有明确使用new []

,请不要使用delete []