2014-07-22 90 views
0

我有這個代碼的一些問題:C++刪除問題動態分配內存

1)爲什麼輸出返回垃圾如果我刪除第一個單元格?

int b = 1025; 
char *v = new char[sizeof(int)]; 
memcpy(v,&b,sizeof(int)); 

char *pp = (char*)v;  
++pp; 

delete v; // is equal delete &v[0] 

cout<<"salida"<<*pp; 

2)如何刪除當我有動態分配的內存無效* ...

void *pv = v; 

是正確的

delete pv; 

delete [](char*) pv; 
+2

1.未定義的行爲。 – chris

回答

0

new[]的調用需要在相同的存儲器地址上調用delete[]並使用相同的指針類型進行匹配。

new的調用需要在同一內存地址上調用delete並使用相同的指針類型進行匹配。

如果你混淆了,那麼你調用未定義的行爲,並最終會有問題。

由於某些編譯器如何實現動態分配的內存,在某些簡單情況下,您可能偶爾會「幸運」並放棄它,但這仍然是一個壞主意,隨時可能會崩潰。如果使用具有析構函數的類類型嘗試此操作,那麼通常會導致析構函數無法在某些或所有實例上正常運行。但是當然還有其他的可能性,比如堆腐敗。

所以一個new char[]聲明的結果必須可以通過delete[]聲明char*類型的指針釋放。

+0

感謝responde so delete [](char *)pv;是正確的 ? – WilD

+0

@Pepe是的,如果你真的需要在那裏有一個void指針,那麼使用該類型是正確的方法。 – TheUndeadFish

0

究竟是什麼你試圖刪除,char *vvoid *pv

如果你想刪除char *v

delete[] v; v = NULL; // v still exists, but it's a dangling pointer now, so we set it to NULL (or 0)

通常當你想delete的東西,它必須與new配對。所以我覺得,如果你想刪除void *pv,您必須將void指針初始化爲new這樣的:

void** pv = new(void*); // Create a void pointer using new pv = (char *)v; delete pv;

+0

感謝您的迴應,但在第二我想刪除無效* pv – WilD

+0

我有問題的大小,因爲void *指向第一個字節,但我想刪除所有分配的空間。 – WilD

+0

@Pepe嘗試我剛添加的代碼。 –

0

你不能只刪除一個動態分配的數組的元素。如果您使用new[]分配陣列,則只能刪除整個陣列,而您必須使用delete[]而不是delete

char *v = new char[sizeof(int)]; 

然後

delete v; 

調用未定義的行爲。你需要做delete[] v,然後你不能再使用pp,因爲它指向的東西已被刪除。

1

我認爲你要做的是釋放動態分配的內存。 首先一個指針總是一個int大小。

它只處理數據位置(引用)。 char指針可以存儲char類型變量的地址。

void指針可以存儲任何數據類型的地址。

so刪除選項適用於這兩種類型的數據類型。

它只是釋放空間,並使其堆上可用