首页 > 队列pop函数

队列pop函数

突然有个这样的疑问:如下代码,这样子的访问是完全安全的吗?不是队列头元素已经删除,那么后面继续访问它,这样可以?
注:pop函数返回头元素的指针。

/* q为一个队列,p是队列元素的指针 */
p = q.pop();
/* something else */
printf("%d",p->value);

显然你的函数应该返回一个值而不是指针

显然出队的东西是要被free掉的,所以你这样的确是不安全的。
如果没有free就会内存泄漏,如果free了就是访问非法内存(虽然简单的程序运行的时候不一定会出问题)

而且free这个动作是在出队的时候做的,而不应该出队之后让调用者来做,所以楼上的回答是有问题的

by the way,如果你非要返回指针的话,可以像C++ stl那样,把pop分为两个动作。front和pop。pop只负责出队的动作,返回类型为void。front负责获取队列头部元素的指针。

这样,你用的时候用front取出来尽管用,等到用完了再pop。就不会有问题了。


不是删除,是出队;

p = q.pop()执行之后,p 指向该元素,同时 队列的指针会指向该队列下一个元素,并且队列长度减一。
只要 p 指向的元素在内存里没有被销毁,那么就可以访问的。

当然,如果这个队列是你自己实现的,在pop后free队头元素,那么就真的无法访问的,不过一般都不会这么做,否则就失去队列的实际意义了。

【热门文章】
【热门文章】