| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7270 人关注过本帖
标题:链表中的节点都是通过new来申请到内存的吗?
取消只看楼主 加入收藏
牧羊人94
Rank: 2
等 级:论坛游民
帖 子:14
专家分:41
注 册:2016-3-17
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:3 
链表中的节点都是通过new来申请到内存的吗?
//构造另一个类模板例      
        CList<CNode> nodelist;            //构造类模板例
    for (int i = 0; i < 5; i++)
    {
        CNode* pNode = new CNode();    //创建节点对象
        pNode->m_Data = i;        //设置节点数据
        nodelist.AddNode(pNode);    //向链表中添加节点
    }
  上面的代码是正确的,我改成如下代码就出错了:
        CList<CNode> nodelist;            //构造类模板例
    for (int i = 0; i < 5; i++)
    {
        CNode pNode ;    //创建节点对象
        pNode.m_Data = i;        //设置节点数据
        nodelist.AddNode(&pNode);    //向链表中添加节点
    }
这是什么原因啊?查了好久不太懂,原因真的是我问的那个问题吗?

2016-03-21 16:44
牧羊人94
Rank: 2
等 级:论坛游民
帖 子:14
专家分:41
注 册:2016-3-17
收藏
得分:0 
回复 4楼 rjsp
CList类模板定义如下:
template <class Type>
class CList
{
public:
    int m_NodeSum;
    Type* m_Header;
    CList();
    ~CList();
    void AddNode(Type* pNode);    //向链表尾节点处添加新的节点
    Type* MoveTrail();    //返回尾节点指针
    void PassNode();
};
AddNode方法实现如下:
void CList<Type>::AddNode(Type* pNode)
{
    if (0 == m_NodeSum)
        m_Header = pNode;
    else
    {
        Type* pTrail = MoveTrail();
        pTrail->m_pNext = pNode;
    }
    m_NodeSum++;
}
    其实,我的问题是,像语句“CNet pNode;  pNode.m_Data = 10; netlist.AddNode(&pNode);”中,
CNet pNode定义了pNode对象,我想要把pNode这一对象添加到链表对象netlist中,所以给AddNode方法
传递pNode的地址,让尾节点的m_pNext指针指向pNode的地址,这里有什么错误吗?
    而语句“CNet* pNode=new CNet();   pNode->m_Data = i * 10;    netlist.AddNode(pNode);”中,
定义了一个指向CNet对象的指针pNode,然后把这个指针传递给AddNode方法,这跟前面我的写法有什么特殊
的区别吗?还请前辈们多多指教!

【附】错误提示:
0x00B7A1A7 处有未经处理的异常(在 链表类模板的使用.exe 中):  0xC0000005:  写入位置 0x00000004 时发生访问冲突。
2016-03-22 09:57
牧羊人94
Rank: 2
等 级:论坛游民
帖 子:14
专家分:41
注 册:2016-3-17
收藏
得分:0 
回复 4楼 rjsp
您说的“CNode pNode; 中pNode是个临时对象,离开作用域就不存在了”,那
CNode* pNode=new CNode(); 中pNode指针不也是个临时对象?离开作用域就不存在了?
2016-03-22 10:01
牧羊人94
Rank: 2
等 级:论坛游民
帖 子:14
专家分:41
注 册:2016-3-17
收藏
得分:0 
回复 4楼 rjsp
刚才试过用下面的语句去执行:
程序代码:
CList<CNet> netlist;
    CNet pNode1;
    pNode1.m_Data = 10;
    netlist.AddNode(&pNode1);
    CNet pNode2;
    pNode2.m_Data = 20;
    netlist.AddNode(&pNode2);
    CNet pNode3;
    pNode3.m_Data = 30;
    netlist.AddNode(&pNode3);
    netlist.PassNode();

发现就没那个问题了,好像真如您所说是pNode对象的作用域在下一个循环开始时就要被销毁了?
因此,即使把pNode的地址给AddNode方法也是没用的,因为那pNode对象在进入下一个循环时就会被销毁,
所以导致了错误。而动态分配内存则是在被delete前都是一直存在的,所以没问题。

我这样说是对的吗?还请帮忙考证下~
2016-03-22 10:24
快速回复:链表中的节点都是通过new来申请到内存的吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016390 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved