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()
;它只需初始化该值,并将指针指定给singlelong
发生内存损坏的原因是,您使用的是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()
;它只需初始化该值,并将指针指定给singlelong
发生内存损坏的原因是,您使用的是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-