请教: 这段代码为什么会有内存泄漏?

请教: 这段代码为什么会有内存泄漏?

请教: 这段代码为什么会有内存泄漏?
请教: 这段代码为什么会有内存泄漏?

发现一个问题,只要屏蔽中间的一段代码:
SV *tmpSV = av_pop(av);
HV *hv = (HV *)SvRV(tmpSV);
numHashElts = hv_iterinit(hv);

while (numHashElts--)
{
hv_iternextsv(hv, &hashKey, &hashKeyLen);
svVal = *hv_fetch(hv, hashKey, hashKeyLen, 0);

if (safe_strcmp(hashKey, "ip") == 1)
strncpy(tmpInfo->ip, SvPV_nolen(svVal), MATRIX_IP_LENGTH);

if (safe_strcmp(hashKey, "nameserver") == 1)
strncpy(tmpInfo->nameserver, SvPV_nolen(svVal), MATRIX_OBJECT_LENGTH);
就没有泄漏.

单独运行av_pop也会有泄漏


static int _query(MatrixHandler handler, int command,
struct matrix_dns *object, struct linkedlist *ret_list)
{
char calledSubroutine[51];
int av_length, numHashElts, hashKeyLen;
char *hashKey;
struct matrix_dns *tmpInfo;
int retValue;

switch (command)
{
case MATRIX_GETDNSALL:
strncpy(calledSubroutine, "getDNS", 50);
break;
}

dSP; // initialize stack pointer
ENTER; // everything created after here
SAVETMPS; // ...is a temporary variable.
PUSHMARK(SP); // remember the stack pointer
PUTBACK; // make local stack pointer global

call_pv(calledSubroutine, G_ARRAY);

SPAGAIN; // refresh stack pointer
retValue = POPi;

if (retValue < 0) goto clean_stack;

AV *av = (AV*)SvRV(POPs);
av_length = av_len(av);
SV *svVal;

while (av_length-- >= 0)
{
if ((tmpInfo = malloc(sizeof(struct matrix_dns))) == NULL)
{
retValue = ERR_MATRIX_NOMEMORY;
linkedlist_clear(ret_list, free);

goto clean_stack;
}

memset(tmpInfo, 0, sizeof(struct matrix_dns));

SV *tmpSV = av_pop(av);
HV *hv = (HV *)SvRV(tmpSV);
numHashElts = hv_iterinit(hv);

while (numHashElts--)
{
hv_iternextsv(hv, &hashKey, &hashKeyLen);
svVal = *hv_fetch(hv, hashKey, hashKeyLen, 0);

if (safe_strcmp(hashKey, "ip") == 1)
strncpy(tmpInfo->ip, SvPV_nolen(svVal), MATRIX_IP_LENGTH);

if (safe_strcmp(hashKey, "nameserver") == 1)
strncpy(tmpInfo->nameserver, SvPV_nolen(svVal), MATRIX_OBJECT_LENGTH);
}

linkedlist_add(ret_list, (void *)tmpInfo);
}


clean_stack:

PUTBACK;
FREETMPS; // free that return value
LEAVE;

return retValue;
}
百年不遇的大帖,这个这个.
百年不遇的大帖,这个这个,这是perl吗?
讨论C上我们这?去Perlchina的好朋友ChinaUnix那里问吧。
当然你也可以等等看,
谁叫你这么幸运,
perlchina不会C的人很少,我就是一个。
看看那些类型,是跟PERL有关系的.
哈哈,perlchina人气上来了,不错,好现象!
to 二楼:
PerlChina 人气不够,好不容易来个人,你怎么能把人家往外撵呢?[CCB]10[/CCB]
呵呵,开个玩笑,不要在意。


to 楼主:
内存泄漏是必然的,因为你的 av_pop 的用法不对。
av_pop/av_shift 都不会递减引用计数,
因此,tmpSV 就会无法释放。
你应该把
[quote]SV *tmpSV = av_pop(av);[/quote]
这一行改成下面这样:
[quote]SV *tmpSV = sv_2mortal(av_pop(av));[/quote]
应该就好了。
perlxs....
谢谢flw! 谢谢各位的帮助!.
谢谢flw! 谢谢各位的帮助! 确实是由这个问题引起的!
指针又见指针.