memcpy不会抛出异常吗?

mgr*_*y88 3 c++ memcpy visual-studio

希望有一个简单的答案,因为这似乎是一个简单的问题,但我无法在互联网上找到任何关于此的信息.

在下面的代码片段中,Visual Studio在"delete bytes;"行中抱怨无法访问的代码.

try
{
   memcpy(bytes, other.bytes, count);
}
catch (...)
{
   delete[] bytes;
   throw;
}
Run Code Online (Sandbox Code Playgroud)

memcpy不会抛出异常吗?

Ser*_*ier 9

没有.memcpy是一个C函数.它不了解C++的特性,例如异常.(当然,在C++中使用它是完全合法的,尽管可能不是最好的主意).

回应karlphillip:我必须澄清我的想法:在C++中,memcpy应该只用于对象私有实现中的低级缓冲区副本.它不应该像在C中那样平常使用(例如复制数字数组),因为普通的vanilla缓冲区现在通常隐藏在类实现中.包装数组或其他大量数据(例如std :: array)的类会公开操作其内容的方法.到我写这篇文章的时候,Mark Ransom很好地总结了它;-)

  • 我很想看到那个集会.当我这样做时,我会报告. (2认同)

Rob*_*edy 5

您的catch块捕获 C++ 异常。在您的平台上,memcpy未定义为抛出 C++ 异常,并且您的编译器知道这一点,因此它会正确通知您您的catch块将永远不会执行。

允许用于memcpy抛出C ++异常。对于任何一个指针不指向有效对象的情况,函数的行为是未定义的。在这种情况下,函数抛出 C++ 异常是完全有效的,因为未定义的行为意味着它可以做任何事情

您可能会发现memcpy在您的平台上读取或写入无效内存时会引发操作系统异常。您可能会遇到访问冲突,但 C++catch块不会捕获这种异常。为此使用__try__except。更好的是,分析和编辑您的程序,以确保您永远不会遇到这种情况。这样您就不必担心任何特定平台的行为。