Разве memcpy не генерирует исключения? - PullRequest
3 голосов
/ 23 августа 2011

Надеюсь, что на этот вопрос есть простой ответ, поскольку он кажется простым вопросом, однако мне не удалось найти какую-либо информацию по этому вопросу во внутренних сетях.

В следующем фрагменте кода Visual Studio жалуется нанедоступный код в строке «delete bytes»;

try
{
   memcpy(bytes, other.bytes, count);
}
catch (...)
{
   delete[] bytes;
   throw;
}

разве memcpy не генерирует исключения?

Ответы [ 4 ]

9 голосов
/ 23 августа 2011

Нет.memcpy - это функция C.Он не знает о возможностях C ++, таких как исключения.(Конечно, совершенно законно использовать его в C ++, хотя, возможно, это и не лучшая идея).

В ответ на karlphillip: я действительно должен прояснить свои мысли: в C ++ memcpy следует использовать только для низкогоуровень буфера копирует внутри частной реализации объекта.Его не следует использовать так же обыденно, как это было в C (например, для копирования числовых массивов), потому что обычные буферы теперь обычно скрыты внутри реализаций классов.Классы, которые обертывают массивы или другие большие объемы данных (например, std :: array), предоставляют методы для управления их содержимым.И к тому времени, когда я пишу это, Марк Рэнсом хорошо суммировал это; -)

4 голосов
/ 23 августа 2011

Ваш блок catch перехватывает исключения C ++.На вашей платформе memcpy не определен для генерации исключений C ++, и ваш компилятор знает об этом, поэтому он правильно сообщает, что ваш блок catch никогда не будет выполнен.

Это разрешено для memcpy для исключения C ++.Поведение функции не определено для случаев, когда один из указателей не указывает на допустимый объект.В этой ситуации вполне допустимо, чтобы функция генерировала исключение C ++, потому что неопределенное поведение означает, что для нее вполне допустимо делать что угодно .

Вы можете обнаружить, что memcpy на вашей платформе вызывает ОС исключения, когда вы читаете или пишете неверную память.Вы можете получить нарушение прав доступа , но блок C ++ catch не улавливает такого рода исключения.Для этого используйте __try и __except.А еще лучше, проанализируйте и отредактируйте свою программу, чтобы убедиться, что вы никогда не попадете в такую ​​ситуацию.Тогда вам не нужно беспокоиться о поведении какой-либо конкретной платформы.

1 голос
/ 23 августа 2011

Нет, memcpy не генерирует исключения.

0 голосов
/ 23 августа 2011

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

...