关于“野指针”的问题

最近在用Qt做一个程序,其中就涉及到了“野指针”的,果然出了问题(为什么要用果然呢? 因为以前看过林锐博士的一篇文章提到过这个问题),多次调试检查后才解决。现记录如下:

问题描述:程序的目的大概是一个读文件数据并在QGraphicsScene上画出图形再删掉这些图形。程序每运行一次,虽然调用QGraphicsScene的clear()清除items,但是内存占用增加大概300K左右。

问题分析:程序中有一个循环(大概4000次左右,根据文件大小不同而不同),在循环中我new了一个对象,在循环结束时delete了这个对象。 但是并没有把对象指针赋为NULL,导致每循环一遍产生了一个野指针,从而内存不断增加。以下是程序片段:

while(!in.atEnd())
                        {
                           QPainterPath *pLinePath = new QPainterPath();
                           QVector <QPointF> *plinePoint = new QVector <QPointF>;

                           in>>drawItem;
                           inName>>itemName;

                           L5RoadName.append(itemName);
                           if(drawItem=="LINE" || drawItem=="Line")
                                {
                                   plineNode=2;
                                }
                            else if(drawItem=="PLINE" || drawItem=="Pline")
                                {
                                    in>>plineNode;
                                    in.flush();

                                }
                            else
                                break;

                            for(int i=0; i!=plineNode; i++)
                                {
                                    in>>P1_x>>P1_y;
                                    in.flush();
                                    testPoint.setX(P1_x * 100000000.0);
                                    testPoint.setY(20000000000.0-P1_y * 100000000.0);
                                    plinePoint->append(testPoint);
                                
                                }
                            for(int i=0; i<(plineNode); i++)
                                {
                                    if(0==i)
                                        {
                                            testpoint1=plinePoint->first();
                                            pLinePath->moveTo(testpoint1.x(),testpoint1.y());
                                        }
                                    else
                                        {
                                            testpoint1=plinePoint->at(i);
                                            pLinePath->lineTo(testpoint1.x(),testpoint1.y());
                                        }
                                }

                            L5RoadPath.append( *pLinePath);
                            in>>symbol;
                            delete plinePoint;
                            delete pLinePath;
                            plinePoint=NULL; 
                            pLinePath=NULL; 
                        }

 在增加了最后两条语句后再调试,发现内存占用不再增长。

 

回答: 当我们使用free函数释放一个野指针时,会出现以下问题。首先,野指针是指向不可用内存地址的指针,它的值是非法的内存地址。因此,当我们使用free函数释放野指针时,实际上是在释放一个不合法的内存地址,这可能导致程序崩溃或产生未定义的行为。其次,由于野指针不是NULL指针,所以无法通过判断指针是否为NULL来避免使用已释放的内存。因此,即使我们在使用野指针之前进行了NULL指针判断,也无法防止出现错误。所以,释放野指针会导致程序的运行时错误和不可预测的结果。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [【C语言】5. 指针free后为什么要刻意指向NULL野指针(原因、解决)、悬垂指针](https://blog.csdn.net/WL0616/article/details/122650576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++中的野指针问题](https://blog.csdn.net/u011555996/article/details/122245014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值