memcpy不会抛出异常吗?

时间:2011-08-23 16:03:28

标签: c++ visual-studio memcpy

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

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

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

memcpy不会抛出异常吗?

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

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

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

当您正在读取或写入无效内存时,您可能会发现平台上的memcpy会引发 OS 异常。您可能会遇到访问冲突,但C ++ catch块不会捕获这种异常。请使用__try and __except。更好的是,分析和编辑你的程序,以确保你从来没有遇到这种情况。然后,您不必担心任何特定平台的行为。

答案 2 :(得分:1)

不,memcpy不会抛出异常。

答案 3 :(得分:0)

memcpy来自C,它早于C ++异常,所以没有。你永远不会捕获因memcpy而抛出的异常。