Ошибка при возврате после работы с вектором

0

У меня есть кусок кода:

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(), использую его, а затем удаляю и перераспределяю (все без проблем). Я пропустил здесь какую-то большую вещь? Поиски и отладка в течение нескольких часов, похоже, ничего не вызывают. Любая помощь приветствуется!

  • 0
    Разве нет смысла использовать такие вещи, как векторы и строки, чтобы вам не приходилось копаться в дыре управления памятью?
  • 0
    @ chris Может быть, но функция (из требований остальной части программы, которую я не могу изменить) не может ничего вернуть (и выполнение vector <string> & v делает то же самое), так что я как бы загнан в угол где это касается.
Показать ещё 3 комментария
Теги:
pointers
vector

1 ответ

0
Лучший ответ

Здесь многое можно упростить, но по серьезным проблемам:

int * counter =new int;
(*counter)=0;

counter++;

counter++ увеличивает указатель, а не указанное значение. Я не вижу причин, почему это должно быть указателем и, вероятно, следует избегать, поскольку это просто добавляет сложности к этому.

Что делает isNext? Там определенно много вы можете сделать для этого, и когда это будет сделано, это, скорее всего, уменьшит проблемы.

Что вы собираетесь разбить? Если вектор неинициализирован, вызов ->clear() может вызвать нарушение доступа.

  • 1
    Да, это должно быть просто int counter = 0; и удалить new / delete полностью.
  • 0
    isNext принимает const char * a и b и проверяет наличие звездочек с b.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню