2011-01-05 78 views
0

我在下面的例子中遇到了diffuculty,最后一行产生了“abort has been called”错误。我不明白为什么会这样。std ::向量中止问题

为了清晰起见,我使用(* abc).def而不是abc-> def。

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

class branch 
{ 
    public: 
     unsigned short n; 
     std::vector<branch> branches; 

     branch left() 
     { 
      return branches.at(0); 
     } 
}; 

void main() 
{ 
    branch trunk = branch(); 
     trunk.n = 0; 
     branch b1, b2; 
     b1.n = 0; 
     b2.n = 5; 
     b1.branches.push_back(b2); 
     trunk.branches.push_back(b1); 

    branch* focus1 = &(trunk.branches.at(0)); 
    branch* focus3 = &(trunk.left()); 

    std::cout<<trunk.left().branches.at(0).n<<std::endl; // ok 
    std::cout<<(*focus1).branches.at(0).n<<std::endl; // ok 
    std::cout<<(*focus1).left().n<<std::endl; // ok 
    std::cout<<(*focus3).branches.at(0).n<<std::endl; // problem 
} 
+0

什么操作系统?什么编译器?另外 - >比(* p)更清晰.def – 2011-01-05 23:49:09

+0

Windows Vista和VSC++ 2010 – alan2here 2011-01-05 23:57:46

回答

6

这段代码的问题是,trunk.left()返回分支的副本,而不是分支的参考。因此,您的focus3指针指向一个临时对象,该对象在该行代码执行完后立即清理干净。因此,当您尝试在最后一行解除引用focus3时,您正在跟踪指向垃圾数据的指针,这会导致崩溃。

若要解决此问题,请使left返回对分支的引用,或使focus3为const引用,这会将临时的生命周期延长到引用的生存期。

+0

啊,'const'引用是好的,但是OP必须使'const'方法来使用它。 – ephemient 2011-01-05 23:54:29

+0

的确如此,但我坚信这是一个好主意。 (如果你不同意,请不要与我展开激烈的战争;这是不值得的。):-) – templatetypedef 2011-01-05 23:59:45

+0

我通过添加&后分支和左()之前使用了一个参考。这工作完美。在这种情况下,这种解决方案也更加高效,并且允许编辑以及阅读。虽然这个例子是一个不同寻常的代码的简化版本。 – alan2here 2011-01-06 00:09:44