0

我有一个非常复杂的类,它包含在另一个类的向量中。我报告了一个更简单的,无论如何它有我能够找到的问题。

// the inner class
class DuffyDuck{
    int isblack;   // 0 is white, 1 is black
    int n_duck;
    vector<DuffyDuck> * point_Duck;
    public:
    DuffyDuck(int isblack):isblack(isblack){
    }
    void set_point(vector<DuffyDuck> & Abitants){
        point_Duck=&Abitants;
    }
};

// the complessive class

class DuckCity{
     vector<DuffyDuck> DuckAbitants;
     public:
     DuckCity(int numwhite,int numblack){

         for(int i=0;i<(numblack+numwhite);++i){
             DuckAbitants.push_back(DuffyDuck(i>=numblack));
             DuckAbitants[i].set_point(DuckAbitants);
         }

     }
};

现在这可行(我在几个函数中使用了 point_Duck),但是如果我在示例“(*point_Duck)[2].n_duck;”中调用它之后执行类似的操作 在一个函数中,项目崩溃了。

只有当我这样做时才会发生这种情况:

DuckCity LittleTown(0,0);
LittleTown=DuckCity(3,5); 

在使用了一些调用指针的函数之后。

如果我直接做 LittleTown(3,5) 一切都是正确的。

我希望我解释得足够好。

4

3 回答 3

5

该类DuffyDuck存储 avector<>成员的地址DuckCity。因此,当您将 复制DuckCity到不同的实例时,该新实例将具有不同的vector<>实例。但是,该向量中的每个实例仍然具有旧实例DuffyDuck的一部分的地址。DuckCity

因此,您的副本littleTown会产生悬空指针。

我建议您重新考虑您的设计DuffyDuck,或者实现一个赋值运算符,DuckCityvector<>. 如果您实现了赋值运算符,请记住还要遵循三法则

于 2013-09-26T19:31:25.813 回答
0

问题的原因是每个DuffyDuck都有一个指向 DuffyDuck(s) 向量的指针。当类被销毁时,引用变得无效-->崩溃。

DuckCity littleTown(1,2); // this creates a duck city 
                          // with each duck pointing to the DuckAbitans vector.
littleTown=DuckCity(3,5); // this initializes another instance (call it INST) 
                          // of DuckCity and
                          // then it assigns (via = operator) the value to littleTown
                          // by **copying** the DuffyDuck structures into a newly 
                          // allocated vector. This makes the pointer of each DuffyDuck
                          // invalid after INST is destroyed (as it is a temporary object)
于 2013-09-26T19:32:01.177 回答
0

当您复制 的地址时Abitants,您将获取由 创建的临时对象中的向量的地址DuckCity(3,5)。然后将此临时对象复制到littleTown中,并销毁原始对象。这意味着您的原始Abitats指针指向未使用的内存,这反过来会导致崩溃。

很难确切地说你应该如何解决这个问题——可能是通过一个“重建”Abitats指针的复制构造函数。

于 2013-09-26T19:32:46.903 回答