2017-02-02 8 views
1
int a[4] = {10,20,30,40}; 
std::vector<int> vec(4); 
std::copy(a, a + 4, vec.begin()); 

Я получаю следующий errorin vC++, он говорит предупреждение, но помечен как ошибка, как я могу это решить?C++ массив копия, показывающая ошибки в vC++

Тяжесть Код Описание проекта Строка файла Подавление Государственный Ошибка C4996 std::copy::_Unchecked_iterators::_Deprecate: Вызов std::copy с параметрами, которые могут быть небезопасны - это вызов полагается на вызывающего абонента, чтобы проверить, что принятые значения являются правильными. Чтобы отключить это предупреждение, используйте -D_SCL_SECURE_NO_WARNINGS. Смотрите документацию о том, как использовать Visual C++ 'Проверено итераторы' ConsoleApplication3 е: \ Программы \ VC \ включить \ xutility 2372

+0

Используйте 'std :: begin (a)' и 'std :: end (a)'. В его нынешнем виде вы задаете размер с помощью 'a + 4', и что произойдет, если вы толстый палец' a + 5' там? – lcs

+0

std :: copy (std :: begin (a), std :: end (a), vec.begin()); также показывает ту же ошибку. – Curious

+0

'std :: copy (std :: begin (a), std :: end (a), std :: back_inserter (vec))' – lcs

ответ

2

По умолчанию MSVC принизить некоторые API, которые он считает небезопасным. В принципе, доступ к необработанной памяти, где ошибка в одном параметре может привести к переполнению буфера на стороне чтения или записи.

Среди них std::copy.

Вызов устаревшего API приводит к тому, что MSVC генерирует сообщение об ошибке.

Вы можете отключить эту отмену с помощью -D_SCL_SECURE_NO_WARNINGS, как следует из соображений.

This может решить вашу проблему; он включает в себя обертывание необработанного указателя с помощью «проверенного итератора массива», что означает, что (по крайней мере, при отладке) вы получаете утверждения и/или исключения вместо повреждения памяти, если вы ошибаетесь.

Переполнение буфера является одной из наиболее распространенных ошибок в приложениях C/C++; рассматривайте их как серьезную проблему, даже если она имеет затраты времени исполнения, если только и пока вы не докажете, что данный путь критичен по производительности. В этот момент найдите способ статически доказать правильность размеров массива.

+0

Я думаю, что этот ответ слишком добр к VC++. Должно быть ясно, что std :: copy НЕ устарел в C++ Standard, но просто нахмурился Microsoft. Это должно быть проще сделать VC++ уметь вести собственный бизнес. Всякий раз, когда я получаю «устаревшее» предупреждение от VC++, я всегда делаю веб-поиск, чтобы узнать, не устареет ли он повторно. –

1

Безопасный способ вызова копии без риска совершить ошибку с размером. Я бы предположить, что компилятор не предупредит об этом:

int a[] = {10,20,30,40}; 
std::vector<int> vec; 
std::copy(std::begin(a), std::end(a), std::back_inserter(vec)); 

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

В предупреждающем сообщении описано, как отключить предупреждение.