#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 он не восстанавливается) Я удалил и заменил его.