情况有点复杂,但我会尽量解释清楚。
我正在尝试从对象指针向量中获取指向对象的指针,其中对象的属性之一与变量字符串匹配。为此,我将字符串变量绑定到一个函数,然后使用绑定函数尝试找到该对象指针。但是,每当我尝试此操作时,它都会崩溃。我已经尝试了很多不同的测试来找到问题所在,但我仍然一无所知。相关代码如下:
class A {
std::string n;
...
public:
const std::string getN() {
return n
}
};
static bool checkN(std::string n1, A* a) {
if (a->getN() == n1) {
return true;
}
else {
return false;
}
}
void function() {
using namespace std::placeholders;
A* a;
std::string compare = "Yes";
const std::vector<A*> As; //As[0].n = "Yes";
auto check = std::bind(checkN, compare, _1);
a = (*std::find_if(As.begin(), As.end() - 1, check)); //This is the line where it crashes.
}
请注意,这是一个简化版本,但我认为它可以理解。有什么建议么? 编辑:在尝试简化代码时犯了一些语法错误。修复了它们。
答案 0 :(得分:4)
As
是一个 const std::vector<A*>
,其中包含 no 元素,因此在这种情况下取消引用 std::find_if(...)
返回的迭代器是未定义行为< /em>.
既然你没有提到你为什么在 As.end() - 1
中做 std::find_if(...)
,我假设你这样做是为了摆脱分段错误,但我恐怕赢了也没有摆脱上面的问题。
现在,要防止这种未定义行为发生,您要做的是检查std::find_if(...)
返回的迭代器是否是不超过容器的最后一个元素(即检查是否std::find_if(...) != As.end()
,然后才应该尝试取消引用std::find_if(...)
返回的迭代器。 >
#include <functional>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <iomanip>
#include <vector>
#include <string>
// ...
int main() {
using namespace std::placeholders;
std::string compare = "Yes";
const std::vector<A*> As;
// Store the iterator returned by 'std::find_if(...)' inside a variable
auto it = std::find_if(As.begin(), As.end(), std::bind(checkN, compare, _1));
// Check whether the iterator is NOT past the last element i.e. check if it is not equals 'As.end()'
if (it != As.end())
std::cout << std::quoted(compare) << " found at index " << std::distance(As.begin(), it) << "!" << std::endl;
// Otherwise, if the iterator is, in fact, equals 'As.end()', then it is safe to assume that the element was not found
else
std::cout << std::quoted(compare) << " was not found." << std::endl;
}