在递归中使用对象内存指针(避免使用堆栈指针)的有关问题()
在递归中使用对象内存指针(避免使用堆栈指针)的问题(高手进)
最近在做一个Word处理程序,需要用XML存储Word的目录信息,在需要的时候处理XML文件,提取目录信息。
因为目录可能是多级目录,所以需要用递归读取XML节点信息。
这是解析XML目录节点的递归函数:
void ParseOutLineNode(CXMLNode *pNode,...)
{
...
CXMLNode node;
node = GetSilbing(...); //获取当前节点的兄弟节点
...
ParseOutLineNode(&node,...);//递归
}
下面是对递归的调用:
CXMLNode rootNode;
GetOutLineNode(&rootNode); //获取根节点的rootNode指针
ParseOutLineNode(&rootNode); //将指针传给递归函数
//-----------------------------
原先我是这样调用递归函数的:
CXMLNode pRootNode = new CXMLNode;
GetOutLineNode(pRootNode); //获取根节点的rootNode指针
ParseOutLineNode(pRootNode); //将指针传给递归函数
DeletePointer(pRootNode);
但是因为在在递归中使用指向堆栈的指针,怕由于操作不慎造成内存泄露,所以改用获取对象的指针传递,
因为对象是有生命周期的,这样就可以避免自己去申请内存、释放内存。
请高手看看这段代码有没有问题:
CXMLNode rootNode;
GetOutLineNode(&rootNode); //获取根节点的rootNode指针
ParseOutLineNode(&rootNode); //将指针传给递归函数
这两个&rootNode指向的是同一块内存吗?这种内存会在对象rootNode自动释放后也自动释放吗?
对象rootNode会在超出作用域后自动释放吗?
------解决方案--------------------
rootNode是同一块内存,在栈上分配的空间的生命周期是在作用域内。在作用域结束后会自动释放。栈上分配的内存是系统管理的。
------解决方案--------------------
&rootNode是同一块内存,rootNode也会自动释放,而且如果DeletePointer(pRootNode); 能正确释放指针的话,你这两种方式应该没有区别
如果你想避免使用指针,可以把GetOutLineNode等函数的参数改为引用的方式
即声明为void GetOutLineNode(CXMLNode& node); 使用的时候直接传入rootNode就行了
最近在做一个Word处理程序,需要用XML存储Word的目录信息,在需要的时候处理XML文件,提取目录信息。
因为目录可能是多级目录,所以需要用递归读取XML节点信息。
这是解析XML目录节点的递归函数:
void ParseOutLineNode(CXMLNode *pNode,...)
{
...
CXMLNode node;
node = GetSilbing(...); //获取当前节点的兄弟节点
...
ParseOutLineNode(&node,...);//递归
}
下面是对递归的调用:
CXMLNode rootNode;
GetOutLineNode(&rootNode); //获取根节点的rootNode指针
ParseOutLineNode(&rootNode); //将指针传给递归函数
//-----------------------------
原先我是这样调用递归函数的:
CXMLNode pRootNode = new CXMLNode;
GetOutLineNode(pRootNode); //获取根节点的rootNode指针
ParseOutLineNode(pRootNode); //将指针传给递归函数
DeletePointer(pRootNode);
但是因为在在递归中使用指向堆栈的指针,怕由于操作不慎造成内存泄露,所以改用获取对象的指针传递,
因为对象是有生命周期的,这样就可以避免自己去申请内存、释放内存。
请高手看看这段代码有没有问题:
CXMLNode rootNode;
GetOutLineNode(&rootNode); //获取根节点的rootNode指针
ParseOutLineNode(&rootNode); //将指针传给递归函数
这两个&rootNode指向的是同一块内存吗?这种内存会在对象rootNode自动释放后也自动释放吗?
对象rootNode会在超出作用域后自动释放吗?
------解决方案--------------------
rootNode是同一块内存,在栈上分配的空间的生命周期是在作用域内。在作用域结束后会自动释放。栈上分配的内存是系统管理的。
------解决方案--------------------
&rootNode是同一块内存,rootNode也会自动释放,而且如果DeletePointer(pRootNode); 能正确释放指针的话,你这两种方式应该没有区别
如果你想避免使用指针,可以把GetOutLineNode等函数的参数改为引用的方式
即声明为void GetOutLineNode(CXMLNode& node); 使用的时候直接传入rootNode就行了