C++ C++;vector push_back()覆盖相同类型的另一个向量?
我以这种方式定义了一个名为n_best_parse的类: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
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的规则了吗 确保每个包含原始指针的类:
- 建造师
- 复制构造函数
- 赋值运算符
- 析构函数
#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;}
};