нарушение доступа при построении вектора

#c #stl #window #console-application #visual-studio-2019

#c #stl #окно #консольное приложение #visual-studio-2019

Вопрос:

 #include <vector>

std::vector<int> v[1000];

int main()
{
    return 0;
}
  

Я только что использовал этот код с Visual Studio 2019.

     Project1.exe!__CheckForDebuggerJustMyCode() Unknown
>   Project1.exe!std::exchange<std::_Container_proxy *,std::nullptr_t>(std::_Container_proxy * amp; _Val, void * amp;amp; _New_val) Line 599 C  
    Project1.exe!std::vector<int,std::allocator<int>>::~vector<int,std::allocator<int>>() Line 676  C  
    Project1.exe!`eh vector destructor iterator'(void * ptr, unsigned __int64 size, unsigned __int64 count, void(*)(void *) destructor) C  
    Project1.exe!`dynamic atexit destructor for 'v''()  C  
    ucrtbased.dll!00007ffbdf8e48d7()    Unknown
    ucrtbased.dll!00007ffbdf8e42e5()    Unknown
    ucrtbased.dll!00007ffbdf8e441a()    Unknown
    ucrtbased.dll!00007ffbdf8e4a81()    Unknown
    ucrtbased.dll!00007ffbdf8e3c51()    Unknown
    ucrtbased.dll!00007ffbdf8e3afd()    Unknown
    ucrtbased.dll!00007ffbdf8e3b6a()    Unknown
    ucrtbased.dll!00007ffbdf8e3de4()    Unknown
    ucrtbased.dll!00007ffbdf8e4176()    Unknown
    Project1.exe!__scrt_common_main_seh() Line 297  C  
    Project1.exe!__scrt_common_main() Line 331  C  
    Project1.exe!mainCRTStartup() Line 17   C  
    kernel32.dll!00007ffc168c7034() Unknown
    ntdll.dll!00007ffc1829cec1()    Unknown
  

нарушение доступа к 0x00007FF6087210D2.
Вот стек вызовов

Почему этот код выходит из строя? Я пытаюсь установить другую версию Visual Studio (2017), но она по-прежнему выходит из строя. Я также пытался переустановить Window SDK, но это не работает.

Какая может быть возможная причина и как ее решить?


Второй пример кода:

 #include <stdio.h>
#include <vector>

int main()
{
    printf("beforen");
    std::vector<std::vector<int>> v(3000);
    printf("aftern");
    return 0;
}
  

Исключение изменяется при каждом запуске. Один из стеков вызовов для приведенного выше кода:

     ConsoleApplication2.exe!std::vector<int,class std::allocator<int> >::_Getal(void)   Unknown
    ConsoleApplication2.exe!std::vector<int,std::allocator<int>>::vector<int,std::allocator<int>>() Line 446    C  
    ConsoleApplication2.exe!std::_Default_allocator_traits<std::allocator<std::vector<int,std::allocator<int>>>>::construct<std::vector<int,std::allocator<int>>>(std::allocator<std::vector<int,std::allocator<int>>> amp; __formal, std::vector<int,std::allocator<int>> * const _Ptr) Line 695  C  
    ConsoleApplication2.exe!std::_Uninitialized_backout_al<std::allocator<std::vector<int,std::allocator<int>>>>::_Emplace_back<>() Line 1509   C  
    ConsoleApplication2.exe!std::_Uninitialized_value_construct_n<std::allocator<std::vector<int,std::allocator<int>>>>(std::vector<int,std::allocator<int>> * _First, unsigned __int64 _Count, std::allocator<std::vector<int,std::allocator<int>>> amp; _Al) Line 1835   C  
    ConsoleApplication2.exe!std::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>::_Ufill(std::vector<int,std::allocator<int>> * _Dest, const unsigned __int64 _Count, std::_Value_init_tag __formal) Line 1584    C  
    ConsoleApplication2.exe!std::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>::_Construct_n_copies_of_ty<std::_Value_init_tag>(const unsigned __int64 _Count, const std::_Value_init_tag amp; _Val) Line 462  C  
    ConsoleApplication2.exe!std::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>(const unsigned __int64 _Count, const std::allocator<std::vector<int,std::allocator<int>>> amp; _Al) Line 473 C  
>   ConsoleApplication2.exe!main() Line 8   C  
  

этот код также выходит из строя

 #include <vector>

int main()
{
    auto a = new std::vector<int>[3000];
    delete[] a;
    return 0;
}
  
 #include <string>

int main()
{
    auto a = new std::string[3000];
    delete[] a;
    return 0;
}
  

Поэтому я сомневаюсь, что недостаточно памяти, однако приведенный ниже код работает хорошо.

 #include <vector>

int main()
{
    auto a = new int[10000000];
    delete[] a;
    return 0;
}
  

Я попытался удалить все комплекты Visual Studio и Window в установщике Visual Studio и переустановил их, однако это все еще происходит.

Комментарии:

1. Возможно, это не связано с вашей ошибкой, но std::vector<int> v[1000]; объявляет массив из 1000 векторов. Вы имели в виду std::vector<int> v(1000); ?

2. В показанном коде нет ничего плохого, это, очевидно, какая-то неизвестная проблема с установкой или повреждением вашего компилятора или библиотеки времени выполнения.

3. Мне не повезло воспроизвести это поведение.

4. Это похоже на сбой при разрушении, а не при построении dynamic atexit destructor for 'v'' , но, тем не менее, похоже, что это может быть какая-то ошибка VS.

5. однако @GimunEom std::vector<std::vector<int>> v(1000); — это неверный код, поскольку векторы 2-го измерения также должны быть инициализированы. Правильный код будет std::vector<std::vector<int>> v(3000, std::vector<int>(3)); , например

Ответ №1:

Я тестирую вашу программу в Visual Studio 2019, потому что это то, что вы используете.

 #include <vector>

std::vector<int> v[1000];

int main()
{
    return 0;
}
  

Это работает просто отлично. Но вы это уже знаете. Я использую это в 64-битном режиме. (что вы также сделали)

Поскольку при использовании «std::» произошел сбой, я проверил DLL, которые загружаются при использовании std и без него. Вы должны проверить разницу в DLL. Без STD: введите описание изображения здесь

С помощью STD:

введите описание изображения здесь

Я не уверен, действительно ли это проблема с программным обеспечением. (поскольку вы упомянули, что тестировали с Visual studio 2017, и это все равно привело к сбою) В этом случае я бы подумал, что это проблема с вашей оперативной памятью. Возможно, вы можете протестировать свой код на другом компьютере.

Комментарии:

1. Я решил это. Это была проблема ucrtbased.dll . он не был переустановлен при переустановке при переустановке Visual Studio и их компонентов. (даже если при переустановке universial crt он не восстанавливается) Я удалил и заменил его.