2011-04-28 26 views
3

Possible Duplicate:
Is it possible to dynamically create an array of constant size in C++?「新」運營商和類型定義-ED陣列

這是相當的理論問題 - 我不知道爲什麼實際上操作者新的[]中的C++返回指針數組的第一元素和不實際的陣列(或一個指向它的指針)。這來找我試圖做類似

typedef int int4[4]; 
int4* ni4 = new int4; 

雖然我知道爲什麼,這並不工作(雖然它不是在一開始那麼清晰;)),這真讓我心煩的代碼,這在原則是A* ptr= new A;不能編譯。我是唯一覺得奇怪的人嗎?

+1

這是一個錯字還是你的意思是typedef int [4] int4; ? – 2011-04-28 12:28:48

+1

@Eric:這是正確的'typedef'語法。但是在下一行有一個錯字,應該是'int4 * ni4 = new int4;' – 2011-04-28 12:30:38

+0

int [4] int4我得到錯誤:期望在'['token之前的非限定id;第二個錯字糾正 – 2011-04-28 12:31:20

回答

1

我發現這裏的怪是使用operator new[]。該代碼嘗試分配一個聚合的單個實例,如果聚合爲struct,則這將是合法的。

但這是標準在[expr.new]部分中提出的行爲。

然而,有一個非常簡單的解決方法:

typedef int int4[4]; 
int4* ni4 = new int4[1]; 

...

delete [] ni4; 
+0

這真是奇怪,這是標準的行爲。也許typedef的數組不被視爲聚合?無論如何,感謝提供解決方法 - 它似乎比'int4 * ni4 =(int4 *)new int4;'好多了,我一直在使用。但我的問題仍然存在 - 爲什麼標準是這樣制定的?我一直認爲這個標準是針對完整類型的正確性 - 這看起來好像違反了...... – 2011-04-28 12:48:35

+0

爲什麼會這麼奇怪?代碼試圖分配一個數組,所以使用'operator new []'。這就是標準如何指定語義。這個人顯示的代碼等同於'new int [4]',它使用完全相同的對象類型進行分配。 – 2011-04-28 16:17:07

+0

@Johannes:在'new int [4]'中,數組說明符'[4]'實際上是* new-expression *的語法的一部分,它不是類型的一部分。我通常希望有* new-expression *可選的* noptr-new-declarator *來調用'operator new []()',另一個不用調用'operator new()'。特殊情況下數組類型與其他聚合的當前行爲使得難以編寫模板代碼。 – 2011-04-28 17:10:14

0

我不太清楚,如果我理解你的問題。在C++中,和C一樣,指向數組第一個元素的指針和數組本身沒有區別。

編輯:正如已經向我指出,這是不是真的正確的 - 請原諒我的錯誤,我已經花了太多的時間與Java和C#最近;-)

+3

肯定有區別 - 它們是不同的類型。 sizeof會給出不同的結果,你可以編寫引用數組(特定大小)的函數,但不能指向指針。 – 2011-04-28 12:36:16

+1

這是錯誤的,有很大的差異。數組不是指針,但在某些情況下,它可以視爲指針。一些差異:1。不同的'sizeof'' 2.不同的初始化 – 2011-04-28 12:37:12

0

這也許可以認爲以下

new (int[N]); // type int(*)[N] 
new int[N]; // type int* 
new T; /* T* */ 

只有在中間的情況下, N可以是運行時值。儘管如此,規範並沒有建立這樣的類型差異。幾乎在所有情況下,數組都需要特殊處理(因爲不能只複製它們)。所以你應該準備好專門處理它們。例如,您也必須使用delete[]而不是delete

只是要清楚,如果上述情況是真實的,那麼你就需要尷尬語法

int (*p)[N] = new (int[N]); 
(*p)[N-1] = 0; 
p[0][N-1] = 0; /* or, equivalently */ 
p[N-1] = 0; /* but not this, error! */ 

您首先需要取消引用數組指針。

+0

或只是'int * p = new int [N];' - 如果上面是真的;)但是這取決於你需要什麼 - 例如。考慮'(int [N])'作爲聚合(使用'struct {int f [N];}'它會按我希望的方式工作)。 – 2011-04-28 12:53:01

+0

@j_kubik我不明白你的意思是「考慮(int [N])作爲聚合」。 'int [N]'本身就是一個聚合。數組是集合。 – 2011-04-28 17:07:43

+0

這就是我的意思 - 數組是集合,但是它們的語義不同於說結構 - 如果你創建'new'結構,那麼返回的指針指向整個結構體,而不是它的一部分。在數組的情況下,我期望指針返回數組。 – 2013-03-27 02:46:20

0

這是C的遺留問題,它實際上已將它作爲B的遺留物。C++中本地數組的整個處理過程很糟糕,但它們無法對其進行更改。 C++中的許多問題都是這種情況。