簡體   English   中英

如何刪除此Void指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM