std::list為空時調用pop_front的訪問越界問題
std::list為空時調用pop_back訪問越界問題
所以在使用pop_front 、 pop_back要先判斷list是否為空
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>
using namespace std;
void Test() // failed
{
std::list<int *> list;
int n = 1;
std::cout << "n address:" << static_cast<void *>(&n) << std::endl;
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;
if (list.empty())
assert(list.front() == NULL); // 這里會斷言失敗,若list中為指針時在pop_front前一定要先檢查下是否為空,否則會導致訪問越界
usleep(1000*500);
}
}
void Test2() // pass
{
std::list<int> list2;
int n = 1;
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