C++ C++;vector push_back()覆盖相同类型的另一个向量?

C++ C++;vector push_back()覆盖相同类型的另一个向量?,c++,vector,memory-corruption,push-back,C++,Vector,Memory Corruption,Push Back,我以这种方式定义了一个名为n_best_parse的类: class nth_best_parse { public: int traversal; int nth_best_active; int nth_best_passive; double viterbi_prob; nth_best_parse(); nth_best_parse(int t, int nbl, int nbr

我以这种方式定义了一个名为n_best_parse的类:

class nth_best_parse {
      public:
        int traversal;
        int nth_best_active;
        int nth_best_passive;
        double viterbi_prob;

        nth_best_parse();
        nth_best_parse(int t, int nbl, int nbr, double v) {traversal = t; nth_best_active = nbl; nth_best_passive = nbr; viterbi_prob = v;}
    };
然后我将第n个最佳解析的向量声明为两个不同类的成员:

class Edge {        // an edge associates an Earley style dotted-item with a span
      public:

        <some irrelevant stuff>

        Span span;      // Span of the edge
        bool isActive;
        vector<Traversal *> leading_traversals; // The list of traversals which lead to parsing of this edge

        vector<nth_best_parse> n_best_parses;


        union {
                DottedRule rule_state;  // Accessed if isActive is true
                int symbol;     // Accessed if isActive is false
                                // A symbol corresponding to the category of a passive edge
                                // Put inside this union to save space
        };

        inline int span_length() {return span.end - span.start;}

    };

<some other stuff>

class BPCFGParser {

  public:

    // Some data structures used in intermediary computations for calculating the n-best parses

//    vector<vector<int> > nth_best_pairs;
    vector<vector<nth_best_parse> > n_best_pairs_for_traversals;

    <some other stuff>

    void compute_n_best_parses(Edge *e, int n);

    <some other stuff>
}
这是一个宏,在文件开头定义为:

#define PUSH_BEST_PAIR_FOR_TRAVERSAL(x,y,z,t) n_best_pairs_for_traversals[x].push_back(nth_best_parse(x, y, z, e->leading_traversals[x]->active_edge->n_best_parses[y].viterbi_prob * e->leading_traversals[x]->passive_edge->n_best_parses[z].viterbi_prob * t))
顺便说一下,类遍历定义为:

class Traversal {   // Class for a traversal
      public:
        Edge *active_edge;
        Edge *passive_edge;
        Traversal();
        Traversal(Edge *a, Edge *p) {active_edge = a; passive_edge = p;}
    };

实际上,我正在将一些内容推送到向量n_best_pairs_,以进行_遍历,它是类BPCFGParser实例的一个成员,push_back()代码以某种方式覆盖了向量n_best_parses,它是类Edge实例的一个成员。这怎么可能呢?

您确定要向宏传递有效的第一个参数吗?可能您在执行
n\u最佳\u对\u遍历[x]
时访问了越界,因为
x
大于向量大小。

您确定要向宏传递有效的第一个参数吗?可能您在执行
n\u最佳\u对\u遍历[x]
时访问了越界,因为
x
大于向量大小。

您显然在某些地方存在内存损坏问题。
但是这里没有足够的信息来帮助你

但你正在编写C++代码,你的类包含指针。 这不是一个好的标志(在C++类中几乎不存在原始指针)。 这也常常是没有经验的C++开发人员内存损坏的原因!p> 你遵守4的规则了吗

确保每个包含原始指针的类:

  • 建造师
  • 复制构造函数
  • 赋值运算符
  • 析构函数

显然,您在某些地方存在内存损坏问题。
但是这里没有足够的信息来帮助你

但你正在编写C++代码,你的类包含指针。 这不是一个好的标志(在C++类中几乎不存在原始指针)。 这也常常是没有经验的C++开发人员内存损坏的原因!p> 你遵守4的规则了吗

确保每个包含原始指针的类:

  • 建造师
  • 复制构造函数
  • 赋值运算符
  • 析构函数

我猜您正在使用向量来存储对象(可能是遍历?),没有意识到将新元素推到向量上会使指向向量中已有元素的指针无效。如果是这种情况,请使用deque。

我猜您使用的是向量来存储对象(可能是遍历?),没有意识到将新元素推到向量上会使指向向量中已有元素的指针无效。如果是这种情况,请使用deque。

我建议您尝试简化repo我建议您尝试简化repo向量存储的对象类型为n_best_parse,而不是遍历。我在后面推一个新对象的向量和被覆盖的向量是不同的向量。好的,但是如果你在向量中添加元素,你就不能真正观察向量元素。底层数组可能会被重新分配,使您关注的地址不再指向您想要的元素。当元素只添加到末尾时,deque确实可以保证没有重新分配。当然,这可能与向量被破坏无关。您使用其他调试方法看到这个问题了吗?向量存储的是类型为n_best_parse的对象,而不是遍历。我在后面推一个新对象的向量和被覆盖的向量是不同的向量。好的,但是如果你在向量中添加元素,你就不能真正观察向量元素。底层数组可能会被重新分配,使您关注的地址不再指向您想要的元素。当元素只添加到末尾时,deque确实可以保证没有重新分配。当然,这可能与向量被破坏无关。您是否使用其他调试方法看到此问题?是的!实际上我已经检查过了,但我认为我不够仔细。不知何故,它没有给出分段错误,并且发生了内存损坏。感谢您的帮助。您可以使用at()方法而不是运算符[]来更轻松地检测此类问题。它将检查您是否越界并抛出异常,而不是调用未定义的行为。显然是以性能为代价的。是的!实际上我已经检查过了,但我认为我不够仔细。不知何故,它没有给出分段错误,并且发生了内存损坏。感谢您的帮助。您可以使用at()方法而不是运算符[]来更轻松地检测此类问题。它将检查您是否越界并抛出异常,而不是调用未定义的行为。显然是以性能为代价的。
#define PUSH_BEST_PAIR_FOR_TRAVERSAL(x,y,z,t) n_best_pairs_for_traversals[x].push_back(nth_best_parse(x, y, z, e->leading_traversals[x]->active_edge->n_best_parses[y].viterbi_prob * e->leading_traversals[x]->passive_edge->n_best_parses[z].viterbi_prob * t))
class Traversal {   // Class for a traversal
      public:
        Edge *active_edge;
        Edge *passive_edge;
        Traversal();
        Traversal(Edge *a, Edge *p) {active_edge = a; passive_edge = p;}
    };