Вопрос:

вектор, переданный по ссылке в функцию, автоматически распределяется

c++ c++11 gdb

72 просмотра

1 ответ

110 Репутация автора

Я пытаюсь реализовать дерево сегментов, и всякий раз, когда я пытаюсь вызвать свою queryST(...)функцию ниже, она выдает ошибку сегментации, потому что она больше не может получить доступ к входному вектору st. Вектор stниже корректно заполняется, buildSt(...)но всякий раз, когда queryST(...)вызывается функция, возникает ошибка сегментации. Код предоставлен ниже.

Я попытался отладить с помощью GDB, и он показывает много похожих следов, как:

Program received signal SIGSEGV, Segmentation fault. 0x0000555555554de1 in queryST (st=..., v=0, L=0, R=0, l=2, r=3) at segtree.cpp:30 30 return queryST(st, 2*v, L, mid, l, r) + queryST(st, 2*v+1, mid+1, R, l, r);

Кроме того, когда я пытаюсь напечатать вектор stв GDB для вышеупомянутого кадра, он говоритit cannot access memory at address ...

Вектор stосвобождается автоматически или его память перестает быть доступной, завершается GDB.

queryST (...)

int queryST(vector<int>& st, int v, int L, int R, int l, int r) {

    if(l > R && r < L)
      return 0;

    if(l <= L && r >= R)
      return st[v];
    int mid = (L + R) / 2;

    return  queryST(st, 2*v, L, mid, l, r) + queryST(st, 2*v+1, mid+1, R, l, r);
 }

главный(...)

int main() {
   ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

   vector<int> a({1,2,-3, 8, 9});
   vector<int> st(a.size()*4 + 1);
   buildST(st, a, 1, 0, 4);
   //cout << st[1] << endl;
   cout << queryST(st, 1, 0, 4, 2, 3) << endl;
   return 0;
 }

updateST (...)

void buildST(vector<int>& st, vector<int>& a, int v, int L, int R) {                                      
   if(L == R) {
      st[v] = a[L];
      return;
   }
    if(L < R) {
      int mid = (L+R)/2;
      buildST(st, a, 2*v, L, mid);
      buildST(st, a, 2*v+1, mid+1, R);
      st[v] = st[2*v] + st[2*v+1];
    } 
  }

Ожидаемым результатом должен быть ответ на запрос, range[2,3]соответствующий параметрам 5-го и 6-го числаqueryST(...)

Благодарю.

Автор: mohitR0_0 Источник Размещён: 10.08.2019 09:02

Ответы (1)


0 плюса

132371 Репутация автора

Но я до сих пор не могу понять, почему gdb не может получить доступ к вектору st внутри queryST ()

GDB использует отладочную информацию для доступа к переменным.

Для печати stGDB необходимо найти указатель на него. Отладочная информация сообщает GDB, что указатель на stнаходится в стеке с определенным смещением от регистра $rspили $rbp. Когда GDB пытается прочитать эту память (через ptraceсистемный вызов), ptraceвозвращает ошибку (потому что $rspуказывает на нечитаемую память из-за переполнения стека). Следовательно вы получаете cannot access memory at address ...ошибку.

Если вы посмотрите на реальный адрес, вы обнаружите, что он находится чуть ниже границы страницы, и что страница над ним читаема и является последней страницей вашего стека.

Автор: Employed Russian Размещён: 11.08.2019 07:34
Вопросы из категории :
32x32