2011-11-17 74 views
5

以下是我从MSDNnew运营商复制:删除指向函数的指针数组?

new运营商不能用于分配的功能,但所用的指针分配的功能它可以 。以下示例 分配并将七个指针的数组释放到函数 返回整数。

int (**p)() = new (int (*[7])()); 
delete *p; 

那么有什么奇怪的与第一线,它分配一个指针数组的功能,但我就是不明白,第二是如何删除该阵列?我认为它应该是:

delete[] *p; 

任何人都可以解释这一点吗?

+0

是,,,,,, –

+6

不,应该是'删除[] p'(星号)。 – avakar

+0

以及如何“删除* p;”已验证?这就是我无法想出的 – codekiddy

回答

5

坦率地说,正确的答案写在avakar的评论。 正确的代码是

delete[] p; 

delete *p;是不正确的原因有两个:

  1. 我们必须使用delete[]所有动态分配数组。使用 delete将导致未定义的行为。
  2. 指针静态和成员函数不能被删除
+0

我认为你的第二点是不吉利的措辞,虽然你说的正确,两个帐户上的'delete * p'是错误的。指向​​的指针当然可以被删除,假设它们被分配。毕竟,指针就是一个指针。但是'delete * p'不会删除指针,但会尝试删除指向函数。 – Damon

+0

虽然承认我的措辞并不好多...因为当然不是指针被删除,但是也指出了。所以可能“删除需要一个指针,* p不是一个指针”是应该是正确的措辞。 – Damon

+0

感谢Dmitry的回答,也非常感谢别人的回答! – codekiddy

2

如果再加上一个typedef,

typedef int (*FPtr)(); 

new语句可以改写为

FPtr *p = new FPtr[7]; 

,所以这是很明显,资源应该与

delete[] p; 

由他人解释。


顺便说一句,VS 2008及以上版本的MSDN页面确实使用了正确的代码。

int (**p)() = new (int (*[7])()); 
delete [] p; 
+0

这可能是因为我通过Google搜索添加了链接,因此可能会链接与OP引用的版本不同的版本。我的错。 –

+0

我从视觉工作室2008版本复制了代码:D – codekiddy

+0

@codekiddy:它在[2008年美国版本](http://msdn.microsoft.com/en-uS/library/kewsb8ba)中说'delete []' %28V = VS.90%29.aspx)。 – kennytm