Я столкнулся с довольно запутанной проблемой. Похоже, что оператор IF в моей программе вызывает у меня ошибку сегментации.Оператор IF, вызывающий ошибку сегментации?
Я работаю с библиотеками extern и вызывая код из внешних библиотек в инструкции IF, поэтому я не могу предоставить весь код этих функций, потому что у меня его тоже нет.
Основной пример того, что происходит. Поэтому этот пример вызывает у меня Segmentation fault
.
IRank *rank;
//Generating wavelet tree from BWT with sdsl library
if(true) {
std::cout << "I am in IF" << endl; // this gets printed on the screen
wt_huff<> wt; // right after that - segm fault
construct_im(wt, BWT, 1);
WTRank wtrank(&wt);
rank = &wtrank;
}
Однако тот же самый пример, но без IF, когда я закомментировать, не вызывает Segmentation fault
и выполняет нормально.
IRank *rank;
//Generating wavelet tree from BWT with sdsl library
//if(true) {
std::cout << "I am in IF" << endl; // again this gets printed
wt_huff<> wt; // no segmentation error this time
construct_im(wt, BWT, 1);
WTRank wtrank(&wt);
rank = &wtrank;
//}
Оригинальный пример:
// // Decide what rank function to use
IRank *rank;
if(m_wt) {
// Multiary Wavelet Tree rank function :: student implementation
mwt::node *m_wtree = mwt::generateMultiaryWT(BWT, ary);
MultiWTRank m_wt_rank(m_wtree, ary);
rank = &m_wt_rank;
} else if(b_wt) {
// Binary Wavelet Tree rank function :: SDSL implementation
wt_huff<> b_wtree;
construct_im(b_wtree, BWT, 1);
WTRank b_wt_rank(&b_wtree);
rank = &b_wt_rank;
} else if(non_wt) {
// Implementation of rank function not using Wavelet Tree
LinRank lin_rank(BWT);
rank = &lin_rank;
} else {
// should not happen
}
//...
run(rank);
Что здесь происходит, это так запутано?
EDIT: пример другого кода вызывается из этого Snipper
#include "IRank.h"
#include "mwt.h"
class MultiWTRank : public IRank {
private:
mwt::node *wt;
int n_ary;
public:
MultiWTRank(mwt::node *root, int ary) {
wt = root;
n_ary = ary;
}
~MultiWTRank() {
}
index_type rank(index_type index, symbol_type symbol);
};
Так что это строится в первой ПЧ.
EDIT2: Предоставление кода, который генерирует указатель на дерево, которое может привести к неприятности
class mwt {
public:
// Structure of a MW tree node
typedef struct node {
vector<int> data;
vector<node*> next;
} node;
// ...
static node* generateMultiaryWT(string input, int ary) {
//...
return root;
}
узел создается так:
static node* InitRoot(int ary){
node *root = new node;
for(int iter = 0; iter < ary; iter++){
root->next.push_back(NULL);
}
return root;
}
Есть ли какое-нибудь обходное решение, чтобы оно все еще могло быть в if? Может быть, используя ссылку? – Whizzil
Висячий указатель относится к объекту 'wtrank'. «Wt» также может оказаться вне вложенной области, потому что его адрес передается конструктору «WTRank». Это не совсем понятно из всего кода. – Blastfurnace
@Whizzil: Ссылка не поможет, они тоже могут болтаться. У вас возникла проблема с продолжительностью жизни вашего объекта. – Blastfurnace