У меня есть кусок кода:
void split(std::vector<std::string> * v,const char* s,const char* x) {
size_t len = strlen(s);
size_t slen = strlen(x); //slen = Search Length
if(len==0||slen==0)
return;
v->clear();
char* f = new char[len];
memset(f,0,len);
int * counter =new int;
(*counter)=0;
for(unsigned int i = 0; i<len; i++) {
if(isNext((s+(i*sizeof(char*))),x)) {
f[i]=1;
counter++;
}
}
if((*counter)==0) {
delete [] f;
delete counter;
v->clear();
return;
}
...
Однако, когда я отлаживаю его с помощью gdb (на cygwin) или отладчиком visual studio, я получаю эту ошибку (с консоли cygwin)
(gdb) step
36 if(len==0||slen==0)
(gdb) step
38 v->clear();
(gdb) step
std::vector<std::string, std::allocator<std::string> >::clear (
this=0x60003a3e0)
at /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/include/c++/bits/stl_vector.h:1126
1126 { _M_erase_at_end(this->_M_impl._M_start); }
(gdb)
Независимо от того, где я его компилирую, я получаю ту же ошибку! Когда я проверяю значения всех переменных в gdb, все правильно (значения именно то, что они должны быть). Вектор действительно работает, потому что я инициализирую его в main(), использую его, а затем удаляю и перераспределяю (все без проблем). Я пропустил здесь какую-то большую вещь? Поиски и отладка в течение нескольких часов, похоже, ничего не вызывают. Любая помощь приветствуется!
Здесь многое можно упростить, но по серьезным проблемам:
int * counter =new int;
(*counter)=0;
counter++;
counter++ увеличивает указатель, а не указанное значение. Я не вижу причин, почему это должно быть указателем и, вероятно, следует избегать, поскольку это просто добавляет сложности к этому.
Что делает isNext
? Там определенно много вы можете сделать для этого, и когда это будет сделано, это, скорее всего, уменьшит проблемы.
Что вы собираетесь разбить? Если вектор неинициализирован, вызов ->clear()
может вызвать нарушение доступа.
int counter = 0;
и удалить new
/ delete
полностью.