c++ list的坑


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM