[英]How do I delete this Void Pointer?
#define ALIGNBUF(Length) Length % ALIGNSIZE ? \
Length + ALIGNSIZE - (Length % ALIGNSIZE) : Length
short NumCols;
long * ColLenArray, * OffsetArray;
ColLenArray = new long(NumCols * sizeof(long));
OffsetArray = new long(NumCols * sizeof(long));
// THIS CODE SHOULD NOT BE NEEDED TO UNDERSTAND THE PROBLEM
// BUT I HAVE INCLUDED IT JUST IN CASE
////////////////////////////////////////////////////////////
SQLColAttribute(hstmt, ((SQLUSMALLINT) i)+1, SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, &ColLenArray[i]);
ColLenArray[i] = ALIGNBUF(ColLenArray[i]);
if (i)
OffsetArray[i] = OffsetArray[i-1]+ColLenArray[i-1]+ALIGNBUF(sizeof(SQLINTEGER));
////////////////////////////////////////////////////////////
void **DataPtr = new void*[OffsetArray[NumCols - 1] + ColLenArray[NumCols - 1] + ALIGNBUF(sizeof(long))];
delete []DataPtr;
不要以為它可以做到,嘗試過各種想象的方式。
這個代碼工作,因為在程序運行中,我只是無法釋放內存。 每次調用此代碼(不包括所有代碼,因為它不相關)時,內存會變大。 我認為刪除沒有正確發生,並且void *
不斷增長。
我也根據這里的建議更改了上面的一些代碼,但是正如這段代碼所示,內存不斷增長。
您無法在void *
上調用delete
。
解決方案是不要將指向void**
的指針void**
(這是new void*[...]
將給你的)轉換為void*
。 我真的不知道您的代碼應該做什么,但您是否嘗試將DataPtr
的類型更改為void **
?
更一般地說,盡可能避免在C ++中使用void*
。 有更好的解決方案。 如果你編輯你的問題來描述你想要實現的目標,那么我們可以幫助提出建議。
你應該嘗試避免混合void*
和new
。 實際上,在C ++中, new
意味着自動確定指針的類型; 那為什么不應該使用它。 如果您只是處理原始字節,至少可以使用char*
。
其他點是new void*[SIZE]
分配void**
。 所以你應該將聲明改為void **DataPtr
。 在new
之前刪除類型轉換。 你現在可以delete[] DataPtr;
。
代碼有一些問題,變量應該聲明如下:
ColLenArray = new long[NumCols * sizeof(long)]; // declare as long[] (not long())
OffsetArray = new long[NumCols * sizeof(long)];
當你將這些變量聲明為new long()
; 它只是初始化值並指定一個指向單個 long
的指針。
發生內存損壞的原因是,您正在使用正在訪問錯誤內存的ColLenArray[i]
。 由於您要將上述變量用作數組,因此它應該是new long[]
。 然后內存損壞不會發生。 使用后,您應該delete[]
它們。
您只需要一塊可以傳遞給某些數據庫庫例程的內存塊? 因此分配:
char * buffer = new char[ len ];
len是緩沖區的長度,以字節為單位。 要刪除,只需執行:
delete [] buffer;
你想要一個void *傳遞給一個函數?
void * DataPtr = static_cast< void* >( buffer );
要獲得額外的優點,請使用boost來管理刪除:
boost::scoped_array< char > buffer( new char[ len ] );
...那么你不必擔心刪除。 要在此處獲取緩沖區,您需要:
void * DataPtr = static_cast< void* >( buffer.get() );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.