c++ - 仅剩余条目的 vector pop_back() 崩溃

标签 c++ vector crash

代码:

#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>

struct myClass {
    bool bIsDead;
    myClass(bool bDead) {
        this->bIsDead = bDead;
    }
};

void PrintVector(std::vector<myClass*> vec) {
    std::cout << "The vector contains: ";
    for(int i = 0; i < vec.size(); i++) {
        std::cout << vec[i]->bIsDead << " ";
    }
    std::cout << std::endl;
}

int main() {

    std::srand(std::time(0)); // use current time as seed for rng

    std::vector<myClass*> myVector;
    for(int i = 0; i < 10; i++) {
        int tempRand = std::rand() % 2;
//      int tempRand = 1;
        if(tempRand == 1) {
            myVector.push_back(new myClass(true));
        }
        else {
            myVector.push_back(new myClass(false));
        }
    }

    std::cout << "Unsorted: " << std::endl;
    PrintVector(myVector);

    std::sort(myVector.begin(), myVector.end(), [ ]( const myClass *lhs, const myClass *rhs )
    {
        return lhs->bIsDead < rhs->bIsDead;
    });

    std::cout << "Sorted: " << std::endl;
    PrintVector(myVector);


    while(myVector.back()->bIsDead) {
        delete myVector.back();
        myVector.pop_back();
    }

    std::cout << "Removed Dead Ones: " << std::endl;
    PrintVector(myVector);

    return 0;
}

随机输入的输出:

Unsorted: 
The vector contains: 0 0 1 0 0 0 1 1 0 1 
Sorted: 
The vector contains: 0 0 0 0 0 0 1 1 1 1 
Removed Dead Ones: 
The vector contains: 0 0 0 0 0 0 

Hit ENTER to continue...

全 1 的输出(即 pop_back 删除所有):

Unsorted: 
The vector contains: 1 1 1 1 1 1 1 1 1 1 
Sorted: 
The vector contains: 1 1 1 1 1 1 1 1 1 1 

Hit ENTER to continue...

对于这个控制台应用程序,我没有收到任何错误或崩溃警告,但它不会在 pop_back 调用全 1 的情况后输出两个 cout 语句。

关于为什么将指针 vector 弹出回空会导致程序崩溃的任何想法?

最佳答案

您需要添加对 vector 大小的检查。如果您想使用 back() 访问 vector 的最后一个元素,则它不应为 0。

改变这个:

while(myVector.back()->bIsDead) {

到:

while(myVector.size() > 0 && myVector.back()->bIsDead) {

正确代码如下:

#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>

struct myClass {
    bool bIsDead;
    myClass(bool bDead) {
        this->bIsDead = bDead;
    }
};

void PrintVector(std::vector<myClass*> vec) {
    std::cout << "The vector contains: ";
    for(int i = 0; i < vec.size(); i++) {
        std::cout << vec[i]->bIsDead << " ";
    }
    std::cout << std::endl;
}

int main() {

    std::srand(std::time(0)); // use current time as seed for rng

    std::vector<myClass*> myVector;
    for(int i = 0; i < 10; i++) {
        int tempRand = std::rand() % 2;
//      int tempRand = 1;
        if(tempRand == 1) {
            myVector.push_back(new myClass(true));
        }
        else {
            myVector.push_back(new myClass(false));
        }
    }

    std::cout << "Unsorted: " << std::endl;
    PrintVector(myVector);

    std::sort(myVector.begin(), myVector.end(), [ ]( const myClass *lhs, const myClass *rhs )
    {
        return lhs->bIsDead < rhs->bIsDead;
    });

    std::cout << "Sorted: " << std::endl;
    PrintVector(myVector);


    while(myVector.size() > 0 && myVector.back()->bIsDead) {
        delete myVector.back();
        myVector.pop_back();
    }

    std::cout << "Removed Dead Ones: " << std::endl;
    PrintVector(myVector);

    return 0;
}

引用 cppreference

Calling this function(back()) on an empty container causes undefined behavior.

PS:你不需要让问题看起来很吓人来引起我们的注意。

关于c++ - 仅剩余条目的 vector pop_back() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39911419/

相关文章:

java - 用Fraps记录java

c++ - 引用本地可访问数据的正当理由?

c++ - 临时容器对象上的迭代器

c++ - 快速字符串搜索?

c++ - 为什么我不能返回这个 vector 的 vector ?

c++ - Isstringstream 不适用于整数

C++ sleep(0) 循环行为

c++ - 加密我的 C++ 应用程序发送和接收的数据?

android - Videoview Android 崩溃

printing - Cordova -插件打印机崩溃的Ionic2应用程序