0

我想了解有关动态内存的一些信息:类模板的新建和删除,如下所示。

我有一些库(内部开发)定义的类模板,它定义了如下的类模板。

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

4 回答 4

2

我想了解我是否必须做delete [] mpRt

mpRt不,你分配operator new然后你打电话delete mpRt;你必须打电话new/deletenew [] /delete[]成对。

如果你使用ENTRYMXinsideHashTable来动态分配内存new[],你需要调用delete[]insideHashTable来释放它。也不要忘记遵循三法则。

于 2013-08-21T10:08:39.970 回答
2

从标准:

5.3.4 新 [expr.new]

8/ 如果分配的类型是非数组类型,分配函数的名字是operator new,释放函数的名字是operator delete。如果分配的类型是数组类型,则分配函数的名称是operator new[],释放函数的名称是operator delete[]

new总是伴随着delete

new []总是伴随着delete []

在您的情况下,mpRt分配了operator new,您必须使用 解除分配delete

于 2013-08-21T10:14:48.650 回答
1

你为什么会?mpRt不是用 . 分配的数组new[]

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

经验法则:将news 与deletes匹配,将 snew type[]与s 匹配delete []

于 2013-08-21T10:09:17.530 回答
1

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

于 2013-08-21T10:14:11.760 回答