【发布时间】:2016-10-07 07:08:53
【问题描述】:
代码:
#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...
对于这个控制台应用程序,我没有收到任何错误或崩溃警告,但它没有在全 1 的情况下调用 pop_back 后输出两个 cout 语句。
关于为什么将指针向量弹出回空会导致程序崩溃的任何想法?
【问题讨论】:
-
while(myVector.back()->bIsDead) 如果myVector为空会发生什么?
-
太长了。不管怎样,看看
while(myVector.back()->bIsDead)循环和explain it to your rubber duck。 -
哦...不是 pop_Back 导致崩溃,而是 while 循环的下一个 .back() 检查导致崩溃。我应该可以简单地添加一个 'if(empty) { break; }' 来解决这个问题。
-
只需对
delete元素使用for 循环而不是while,然后在完成后调用myVector.clear()。 -
@FriedYeti 我说你问题中的大部分信息完全没用,请相信我。