std::list爲空時調用pop_front的訪問越界問題ios
std::list爲空時調用pop_back訪問越界問題spa
因此在使用pop_front 、 pop_back要先判斷list是否爲空.net
std::list爲empty時調用pop_front致使程序崩潰指針
若是list中裝的是指針,當其爲empty時,再調用pop_front可能會返回一個非NULL的值,此時直接使用這個返回的指針會致使內存越界。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <list>
#include <unistd.h>
#include <assert.h>blog
using namespace std;內存
void Test() // failed
{
std::list<int *> list;
int n = 1;
std::cout << "n address:" << static_cast<void *>(&n) << std::endl;it
while (1)
{
list.push_back(&n);
std::cout << "size:" << list.size() << " front:" << static_cast<void *>(list.front()) << std::endl;
list.pop_front();
std::cout << "size:" << list.size() << " front:" << static_cast<void *>(list.front()) << std::endl;io
if (list.empty())
assert(list.front() == NULL); // 這裏會斷言失敗,若list中爲指針時在pop_front前必定要先檢查下是否爲空,不然會致使訪問越界
usleep(1000*500);
}
}ast
void Test2() // pass
{
std::list<int> list2;
int n = 1;class
while (1)
{
list2.push_back(n);
std::cout << "size:" << list2.size() << " front:" << list2.front() << std::endl;
list2.pop_front();
std::cout << "size:" << list2.size() << " front:" << list2.front() << std::endl;
if (list2.empty())
assert(list2.front() == 0); // 這裏斷言成功
usleep(1000*500);
}
}
int
main( int argc, char **argv )
{
Test2();
Test();
return 0;
}
轉自:https://blog.csdn.net/zmlovelx/article/details/90476306