2016-02-11 54 views
7

我看到delete[]可以釋放一個對象數組。然而,在我讀過的任何消息來源中都沒有提及它是否是錯誤的或未定義的,以提供像delete[3]這樣的參數。我可以提供參數來刪除[]像刪除[3]?

我有以下疑問。

  1. 是在C++標準的規定是否我可以/不可以suplly一個參數delete[]delete[3]
  2. 如果是,那麼效果如何?
  3. 此外,它是在C++中指定我是否可以使用delete作爲從new[]分配的數組?
+3

對不起這個問題,但你爲什麼要給一個參數刪除? –

+2

不要將它與'delete array [3]'混淆,刪除'array [3]'指向的任何東西(所以如果你有一個指針數組),並且不會刪除'array'或者它的某個部分。如果你想這樣做,刪除子數組是不可能的。 – leemes

+0

編寫函數'void move_from_array(int * target,int * source){ * target = * source; delete [1] source ++;/*或簡單地刪除源++ */ target ++; }' – pasha

回答

11

(1)是的,它指定你不能。

(3)它指定的結果是不確定的,所以不要。

4

delete[]是一個運營商。

delete[x]不是有效的C++語法,所以代碼不會編譯。

+0

所以你說的'刪除[]'就像一個函數名'functionxyz',我想要做的是'function123'調用它? – pasha

0

是的,你可以通過delete [x]運算符傳遞任何參數,但它沒有意義。 如果你會提及destructorclass那麼它將調用destructor無限的時間。 參見下面的例子

#include <iostream> 
using namespace std; 
class A 
{ 
public: 
A() { 
cout<<"\n Calling A constructor "; 
} 
/*~A(){ 
cout<<"\n Calling A Destructor "; 
    }*/ 
}; 
int main() 
{ 
A *a1= new A(); 

delete [3] a1; 

return 0; 
} 

這上面的程序(測試用VC)編譯和運行成功,如果未註釋的那部分destructor然後編譯成功但destrutor將調用無限的時間,這是程序的未定義的行爲。