从Resbuf链中删除最后一个Resbuf?
我想知道如何从resbuf链中删除最后一项,我已经尝试在尾部使用acutRelRb(),但AutoCAD会爆炸。有什么想法吗?
// ----- ads_crpssgetex symbol (do not rename)
//++-- (crpSSGetEx ":$" "Add: " "Remove: " '((0. "LINE")(8 . "0")))
static int ads_crpssgetex(void)
{
struct resbuf *pTail ;
struct resbuf *pArgs =acedGetArgs () ;
if (pArgs == NULL)
return RSERR;
if (pArgs->restype != RTSTR )
return RSERR;
TCHAR *mode = pArgs->resval.rstring;
if ((pArgs = pArgs->rbnext) == NULL || pArgs->restype != RTSTR )
return RSERR;
TCHAR *AddStr = pArgs->resval.rstring;
if ((pArgs = pArgs->rbnext) == NULL || pArgs->restype != RTSTR )
return RSERR;
TCHAR *RemStr = pArgs->resval.rstring;
if ((pArgs = pArgs->rbnext) != NULL)
{
if ((pArgs = pArgs->rbnext) != NULL)
{
resbuf *pItrBuf = pArgs;
while(pItrBuf != NULL)
{
pTail = pItrBuf;
pItrBuf = pItrBuf->rbnext;
}
// >>>>>>>>>>>>>>>>> want to delete pTail restype = 100 ; //workaround
pTail->resval.rstring = L"AcDbEntity";//workaround
}
}
TCHAR* promts[] = { AddStr , RemStr };
ads_name set;
if(acedSSGet(mode,promts,NULL,pArgs,set) == RTNORM)
acedRetName(set,RTPICKS);
// acedRetList(pArgs);
return (RSRSLT) ;
}
**** Hidden Message ***** 这似乎行得通代码1]
编辑;堵塞漏洞
看看如何/如果这飞 -
resbuf *pItrBuf = pArgs;
while(pItrBuf->rbnext != NULL) // 继续循环,直到 'next' rb is NULL
{
pItrBuf = pItrBuf->rbnext;
}
pItrBuf = NULL; // 现在是最后一个 rb,让我们转储它!
啊!这次明白了。我需要保存指向最后一项的第二个指针,然后使用
pTail->rbNext=NULL;
然后通过调用
acutRelRb(lastbuf)释放最后一个缓冲区中的内存;
我尝试过将最后一项分配为null,但这只将指针分配为null,这对原始resbuf没有任何作用
resbuf *pItrBuf = pArgs;
while(pItrBuf->rbnext != NULL)
{
pTail = pItrBuf;
pItrBuf = pItrBuf->rbnext;
}
pTail->rbnext = NULL;
if(pItrBuf)
acutRelRb(pItrBuf);
是的,我现在明白了,指向' next '的指针是空的,但是你必须删除前一个缓冲区指向next的指针,这样它就不会指向最后一个rb。
页:
[1]