如何删除此无效指针
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**
(这是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::scoped_array< char > buffer( new char[ len ] );
。那么你不必担心删除。要在此处获取缓冲区,您需要:
void * DataPtr = static_cast< void* >( buffer.get() );
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性