如何删除此Void指针?

时间:2011-05-09 09:23:03

标签: c++ memory-management void-pointers

#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 *不断增长。

我也根据这里的建议更改了上面的一些代码,但是正如这段代码所示,内存不断增长。

3 个答案:

答案 0 :(得分:3)

您无法在delete上调用void *

解决方案是不向void**投射指针 - new void*[...]void*会给你的指针)。我真的不知道您的代码应该做什么,但您是否尝试将DataPtr的类型更改为void **

更一般地说,在C ++中尽量避免使用void*有更好的解决方案。如果你编辑你的问题来描述你想要达到的目标,那么我们可以帮助你提出建议。

答案 1 :(得分:1)

您应该尝试避免混合使用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[]

答案 2 :(得分:0)

您只需要一块可以传递给某些数据库库例程的内存块吗?因此分配:

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() );