C 中小心謹慎的為陣列分配空間

2021-05-27 02:28:42 字數 1043 閱讀 2235

為自定義型別的陣列分配空間得小心,陷阱很多。

首先,如下code是有問題的。

t* at = new t[1];

delete at; //error! using delete

保持new和delete正確的成對使用很重要,因為陣列的分配和歸還所使用的函式不同於非陣列;陣列用operator new和operator delete,而非陣列使用operator new和operator delete來分配記憶體。

其次,從邏輯上說,只要宣告了非陣列形式的函式(op new和op delete),就應該為這些函式宣告陣列的形式。然而奇怪的是,在日常程式設計實踐中,這一點往往被人所忽視。

如果是想呼叫全域性的陣列分配操作,那麼,「僅僅**對全域性形式的呼叫」,可以讓事情變得清晰。

class t

void* operator delete (void *p)  

};如果不鼓勵分配t陣列,那麼可以直截了當地把函式宣告為private並且不提供定義。

另乙個容易產生錯誤的地方在於,傳遞給op new的那個表示大小的引數值,取決於函式是如何被呼叫的。

如果直接呼叫op new或者op new時,這個大小正是分配的物件的大小。

at = new t;

at = static_cast(operator new (sizeof(t) ));

arrayt = static_cast(operator new (5*sizeof(t) ));

但是,隱式的呼叫op new時,編譯器會略微增加一些記憶體請求。

arrayt = new t[5]; //請求記憶體量為 5*sizeof(t) + delta個byte

這裡所請求的額外空間用來記錄關於陣列的一些資訊(個數,單個元素的大小等),對以後**記憶體是必不可少的。

不過,事情遠遠沒有那麼簡單,這個額外空間對於不同陣列分配而言,其大小也是會變化的。

如果你真的需要考慮這種情況,那麼你必須避免編譯器的干預,取而代之的是,使用普通的operate new

將陣列分割為幾個等長度的子陣列(使用slice)

先了解一下slice方法 slice 1.定義 slice 可從已有陣列中擷取返回指定的元素,形成乙個新的陣列 語法 arrayobject.slice start,end 引數 描述 start 必需。規定從何處開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。也就是說,1 指最後乙個元素...

C語言長度為0的陣列

前面在看xen 的原始碼時,遇到了一段 如下所示 注意上面最後一行的 這裡定義了乙個長度為的陣列,這種用法可以嗎?為什麼可以使用長度為 0 的陣列?長度為 的陣列到底怎麼使用?這篇文章主要針對該問題進行簡單的講解。廢話不多說了,現在就開始。長度為的陣列在標準c和 c 中是不允許的,如果使用長度為 的...

c語言學習筆記 簡單易懂的指標陣列分析

指標陣列 它是乙個陣列,陣列裡面的每個元素都是乙個指標型別。例如 int ptr 10 ptr是乙個包含10個int 指標型別的陣列。1 include 2 3 int main void 4 6 int ptr 3 7 int len sizeof ptr sizeof ptr 0 8 for i...