希望有一个简单的答案,因为它似乎是一个简单的问题,但是我无法在互联网上找到任何关于此的信息。
在下面的代码片段中,Visual Studio在“delete bytes;”行中抱怨无法访问的代码。
try
{
memcpy(bytes, other.bytes, count);
}
catch (...)
{
delete[] bytes;
throw;
}
memcpy不会抛出异常吗?
答案 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而抛出的异常。