| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7255 人关注过本帖
标题:链表中的节点都是通过new来申请到内存的吗?
只看楼主 加入收藏
牧羊人94
Rank: 2
等 级:论坛游民
帖 子:14
专家分:41
注 册:2016-3-17
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
链表中的节点都是通过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
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
你改过后的是重复对立同名对象吧,没问题嘛?电脑没在手边……试不了

[此贴子已经被作者于2016-3-21 21:33编辑过]

2016-03-21 21:27
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:1 
解决了要科普哦

[此贴子已经被作者于2016-3-21 21:35编辑过]

2016-03-21 21:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
MFC的CList有AddNode方法吗?算了,不管了。
CNode pNode; 中pNode是个临时对象,离开作用域就不存在了,你把它的地址保存在nodelist中想干什么?
2016-03-22 09:03
牧羊人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
luckhide
Rank: 5Rank: 5
来 自:青岛
等 级:职业侠客
帖 子:51
专家分:338
注 册:2016-3-19
收藏
得分:2 
回复 5楼 牧羊人94
区别很明显。前面只是定义指针,但指针未明确指向,后面定义一个指针并明确指向new出来的一段内存。
2016-03-22 10:30
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:2 
回复 6楼 牧羊人94
这是堆中生成的变量,不因作用域结束而销毁,是要程序员手动销毁或整个程序结束才释放的
2016-03-22 11:27
快速回复:链表中的节点都是通过new来申请到内存的吗?
数据加载中...
 
   



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

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