0

看看这个片段:

#include <string>
#include <iostream>
#include <vector>

using namespace std;

class base {
public:
  string foo;
  base() {};
  base(const base &orig) {
    this->foo = orig.foo;
  };
 ~base() {} ;
};

class derived : public base {
public:
  string bar;
  derived(const derived &orig) : base(orig) {
    this->bar = orig.bar;
  }
  derived() : base() {} ;
  ~derived() {};
};

void asd(derived d)
{
    // works fine
    cout << d.foo << d.bar << endl;
}

int main(void)
{
    vector<derived> v;

    derived bla;

    bla.foo = "Test ";
    bla.bar = "String ";

    v.push_back(bla);

    asd(bla);

    // Why the hell does v.end()->foo and v.end()->bar segfault?!
    cout << v.end()->foo;
    cout << v.end()->bar << endl;
}

为什么会出现分段错误?这是控制台输出(使用 g++ -o test test.cpp -g 编译)

./test
Test String 
zsh: segmentation fault  ./test

派生类 v.end() 的 this 指针没有指向正确的位置……但是为什么呢?

4

2 回答 2

13

end()不是指向最后一个元素的迭代器。它指向最后一个元素之后的一个。取消引用end()是非法的。

back()如果您想要最后一个元素,请使用。

于 2012-12-16T15:15:18.297 回答
3

您的问题是使用 v.end()。

从这里引用

将迭代器返回到 end 返回一个迭代器,该迭代器引用向量容器中的最后一个元素。

过去元素是向量中最后一个元素之后的理论元素。它不指向任何元素,因此不应被取消引用。

因为标准库函数使用的范围不包括其关闭迭代器所指向的元素,所以该函数通常与vector::begin结合使用,以指定包含容器中所有元素的范围。

如果容器为空,则此函数返回与vector::begin 相同的值。

使用 v[0] 代替。(对于此特定测试,请参阅引用页面中有关矢量吸气剂的其他建议)。

于 2012-12-16T15:24:29.807 回答