C++ 如何删除此空指针?

C++ 如何删除此空指针?,c++,memory-management,void-pointers,C++,Memory Management,Void Pointers,不要认为这是可以做到的,要想尽一切办法去做 这段代码可以工作,因为在程序运行时,我无法释放内存。每次调用此代码(不是所有包含的代码,因为它不相关)时,内存都会变大。我认为删除没有正确发生,而且void*的数量还在不断增加 我还根据这里的建议更改了上面的一些代码,但由于这些代码的存在,内存不断增长。您不能在void*上调用delete 解决方案是不要将一个指向-void**(这是newvoid*[…]将提供给您的)的指针投射到void*。我真的不知道您的代码应该做什么,但是您是否尝试过将DataP

不要认为这是可以做到的,要想尽一切办法去做

这段代码可以工作,因为在程序运行时,我无法释放内存。每次调用此代码(不是所有包含的代码,因为它不相关)时,内存都会变大。我认为删除没有正确发生,而且
void*
的数量还在不断增加


我还根据这里的建议更改了上面的一些代码,但由于这些代码的存在,内存不断增长。

您不能在
void*
上调用
delete

解决方案是不要将一个指向-
void**
(这是
newvoid*[…]
将提供给您的)的指针投射到
void*
。我真的不知道您的代码应该做什么,但是您是否尝试过将
DataPtr
的类型更改为
void**


更一般地,尽量避免在C++中使用<代码>空洞*>代码> .<强>有更好的解决方案。如果您编辑您的问题来描述您试图实现的目标,那么我们可能可以帮助您提出一些建议。

您不能在
无效*
上调用
删除

解决方案是不要将一个指向-
void**
(这是
newvoid*[…]
将提供给您的)的指针投射到
void*
。我真的不知道您的代码应该做什么,但是您是否尝试过将
DataPtr
的类型更改为
void**


更一般地,尽量避免在C++中使用<代码>空洞*>代码> .<强>有更好的解决方案。如果您编辑您的问题来描述您试图实现的目标,那么我们可能可以帮助您提出一些建议。

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

#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;
len是缓冲区的长度,以字节为单位。要删除,只需执行以下操作:

char * buffer = new char[ len ];
要将一个void*传递给函数吗

delete [] buffer;
void*DataPtr=static\u cast(缓冲区);
要获得额外的积分,请使用boost管理删除:

void * DataPtr = static_cast< void* >( buffer );
boost::作用域数组缓冲区(新字符[len]);
。。。那你就不用担心删除了。要在此处获取缓冲区,您需要:

boost::scoped_array< char > buffer( new char[ len ] );
void*DataPtr=static_cast(buffer.get());

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

#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;
len是缓冲区的长度,以字节为单位。要删除,只需执行以下操作:

char * buffer = new char[ len ];
要将一个void*传递给函数吗

delete [] buffer;
void*DataPtr=static\u cast(缓冲区);
要获得额外的积分,请使用boost管理删除:

void * DataPtr = static_cast< void* >( buffer );
boost::作用域数组缓冲区(新字符[len]);
。。。那你就不用担心删除了。要在此处获取缓冲区,您需要:

boost::scoped_array< char > buffer( new char[ len ] );
void*DataPtr=static_cast(buffer.get());

您应该尽量避免将
void*
new
混合使用。在C++中,<>代码> NeX/CODEC>是指自动确定指针的类型;那么为什么不应该使用它呢。如果只是处理原始字节,至少可以使用
char*

另一点是
newvoid*[SIZE]
分配
void**
。因此,您应该将声明更改为
void**DataPtr
。在新的
之前删除类型转换。您现在可以
删除[]数据ptr

编辑: 代码有一些问题,变量的声明如下:

void * DataPtr = static_cast< void* >( buffer.get() );
将这些变量声明为,
new long()
;它只需初始化该值,并将指针指定给single
long


发生内存损坏的原因是,您使用的是
ColLenArray[i]
,这是在访问错误的内存。由于要将上述变量用作数组,因此它应该是
new long[]
。这样就不会发生内存损坏。使用后,您应该
删除[]
它们。

您应该尽量避免将
void*
new
混合使用。在C++中,<>代码> NeX/CODEC>是指自动确定指针的类型;那么为什么不应该使用它呢。如果只是处理原始字节,至少可以使用
char*

另一点是
newvoid*[SIZE]
分配
void**
。因此,您应该将声明更改为
void**DataPtr
。在新的
之前删除类型转换。您现在可以
删除[]数据ptr

编辑: 代码有一些问题,变量的声明如下:

void * DataPtr = static_cast< void* >( buffer.get() );
将这些变量声明为,
new long()
;它只需初始化该值,并将指针指定给single
long


发生内存损坏的原因是,您使用的是
ColLenArray[i]
,这是在访问错误的内存。由于要将上述变量用作数组,因此它应该是
new long[]
。这样就不会发生内存损坏。使用后,您应该
删除[]
它们。

@用户:您应该能够在
void**
上调用
delete
(或者在本例中是
delete[]
)@Oli:Smart短语“Avoid void”:D+1@user:您应该能够调用
delete
(在这种情况下,您可以调用
delete[]
)在一个
void**
@Oli:Smart短语“避免void”:D+1@iammilind更改void DataPtr=(void)新void**[OffsetArray[NumCols-1]+ColLenArray[NumCols-1]+ALIGNBUF(sizeof(SQLINTEGER));要作废**DataPtr=newvoid*[OffsetArray[NumCols-1]+ColLenArray[NumCols-1]+ALIGNBUF(sizeof(SQLINTEGER));似乎没有释放内存,在任务管理器中进行了检查,并且每个函数调用都会出现内存。我建议
void**DataPtr=new void*[…]在我的答案中。你试过了吗?在解除分配时,它也应该是
delete[]DataPtr,当您正在分配数组时。@iammilind正在更改void DataPtr=(void)new void**[OFFSETARAY[NumCols-