【发布时间】:2011-08-21 13:12:37
【问题描述】:
#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 * 一直在增长。
我还根据这里的建议更改了上面的一些代码,但是由于这段代码,内存一直在增长。
【问题讨论】:
-
ColLenArray = new long(NumCols * sizeof(long));这是一个错字吗?你稍后再做ColLenArray[NumCols - 1]。 -
@Luc 我没发现问题? ColLenArray 是一个指针。
-
一个指针是的,但指向一个 long。您只能在指向数组元素的指针中建立索引。
-
@Luc 我也在创建指针后调用了这段代码。 SQLColAttribute(hstmt, ((SQLUSMALLINT) i)+1, SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, &ColLenArray[i]); ColLenArray[i] = ALIGNBUF(ColLenArray[i]);
-
@PoiXen
&ColLenArray[i]是一个右值,您不能通过它修改ColLenArray并且ColLenArray[i] = ALIGNBUF(...);分配仍然不会修改ColLenArray和索引它。无论您以哪种方式对其进行切片,每次都会索引指向单个 long 的指针,因此我希望i(和其他偏移量)始终为 0...这也适用于OffsetArray。
标签: c++ memory-management void-pointers