вектор <int>, назначенный функцией, освобожден неправильно - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу проверить сортировку отсчетов в окнах с помощью qtcreator.Я пишу функцию для сортировки, которая возвращает вектор .Для приведенного ниже кода после его выполнения будет отображаться

HEAP [labhw1.exe]:

Heap block at 0000000000995120 modified at 00000000009960D0 past requested size of fa0.

Вектор отладки показывает, что вектор не работает.Если я хочу назначить новое значение для B, оно также сломается.Оператор = вызовет вектор.Кажется, что B не может быть правильно освобожден.

readtxt - это функция, которая читает целые числа из txt-файла и возвращает вектор.Я думаю, что это просто вектор типа int, так что здесь нет ничего общего с указателями.Может быть, это связано с объемом жизни.Кто-нибудь может сказать мне, почему?

Отладка показывает:

1  ntdll!RtlpNtSetValueKey                                                        0x7ff9a61515f3 
2  ntdll!RtlZeroHeap                                                              0x7ff9a613f555 
3  ntdll!memset                                                                   0x7ff9a610e9af 
4  ntdll!RtlpNtSetValueKey                                                        0x7ff9a61504b1 
5  ntdll!RtlReAllocateHeap                                                        0x7ff9a605e57b 
6  ntdll!RtlFreeHeap                                                              0x7ff9a606061c 
7  msvcrt!free                                                                    0x7ff9a37298bc 
8  __gnu_cxx::new_allocator<int>::deallocate                  new_allocator.h 125 0x403990       
9  std::allocator_traits<std::allocator<int>>::deallocate     alloc_traits.h  462 0x40442b       
10 std::_Vector_base<int, std::allocator<int>>::_M_deallocate stl_vector.h    180 0x404252       
11 std::_Vector_base<int, std::allocator<int>>::~_Vector_base stl_vector.h    162 0x4043c1       
12 std::vector<int>::~vector                                  stl_vector.h    435 0x404c11       
13 main                                                       main.cpp        19*  0x4020b4       

* строка: vector B

vector<int> countsort(vector<int> A){
  int k=0;
  for (auto a:A){
    if(a>k)k=a;
  }
  vector<int> C(k+1,0);
  for (int i=0;i<A.size();i++)C[A[i]]+=1;
  for (int i=1;i<k+1;i++)C[i]=C[i-1]+C[i];
  vector<int> B(A.size(),0);
  for(int j=A.size()-1;j>=0;j--){
    B[C[A[j]]]=A[j];
    C[A[j]]-=1;
  }
  return B;
}

int main(){
  vector<int> A=readtxt("A.txt");
  vector<int> B;
  B = countsort(A);
  return 0;
}

1 Ответ

0 голосов
/ 21 сентября 2018

Один совет, когда вы используете vector и ваша программа аварийно завершает работу, вызывайте метод at для вектора вместо [], потому что at выдает исключение - это полезная информация.Ваша программа вылетает в этой строке

B[C[A[j]]]=A[j];

, измените ее на

B.at( C[A[j]] ) = A[j];

, и вы получите исключение - вне диапазона.B вектор слишком мал.Размер B должен быть

    max-value-of-C + 1

, поэтому создайте вектор B следующим образом

vector<int> B( *max_element(C.begin(),C.end()) + 1 ,0 );

, теперь он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...