C++ 为什么STL实现不使用断言来检测未定义的行为?
这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现 基本上,在我看来,STL实现可以添加断言来检测(在运行时)诸如越界访问之类的简单错误。我猜这些访问无论如何在标准中都是未定义的行为,因此打印错误消息和(可选地)中止将符合标准 当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭 作为一个小示例,我希望此代码中止:C++ 为什么STL实现不使用断言来检测未定义的行为?,c++,stl,assert,C++,Stl,Assert,这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现 基本上,在我看来,STL实现可以添加断言来检测(在运行时)诸如越界访问之类的简单错误。我猜这些访问无论如何在标准中都是未定义的行为,因此打印错误消息和(可选地)中止将符合标准 当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭 作为一个小示例,我希望此代码中止: #include <vector> int main() { return std::vector<int>{1,2}[2];
#include <vector>
int main()
{
return std::vector<int>{1,2}[2];
}
#包括
int main()
{
返回std::向量{1,2}[2];
}
顺便说一句,我完全了解valgrind等工具的存在,但这可能是一个额外的好处。此外,像valgrind这样的内存检查工具也不能保证在向量缩小后检测某些错误,例如访问越界元素,因为实现可能不会立即重新分配底层内存
这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现
如果您错了,请尝试定义\u GLIBCXX\u DEBUG
,这会使示例中止:
/home/jwakely/gcc/5/include/c++/5.0.0/debug/vector:402:error: attempt to
subscript container with out-of-bounds index 2, but container only
holds 2 elements.
Objects involved in the operation:
sequence "this" @ 0x0x7fffb8b221a0 {
type = NSt7__debug6vectorIiSaIiEEE;
}
Aborted (core dumped)
当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭
之所以使用单独的机制,而不是assert()
和NDEBUG
,是因为检查会增加开销,因此只有在明确请求时才会启用。这意味着用户可以继续使用assert()
进行自己的检查,而无需打开标准库检查的开销。由于用于跟踪迭代器有效性的额外数据成员,libstdc++的调试模式还存在二进制兼容性问题。有关详细信息,请参阅
Libc++也有类似的检查,使用不同的宏,VC++在调试版本中自动启用类似的检查
这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现
如果您错了,请尝试定义\u GLIBCXX\u DEBUG
,这会使示例中止:
/home/jwakely/gcc/5/include/c++/5.0.0/debug/vector:402:error: attempt to
subscript container with out-of-bounds index 2, but container only
holds 2 elements.
Objects involved in the operation:
sequence "this" @ 0x0x7fffb8b221a0 {
type = NSt7__debug6vectorIiSaIiEEE;
}
Aborted (core dumped)
当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭
之所以使用单独的机制,而不是assert()
和NDEBUG
,是因为检查会增加开销,因此只有在明确请求时才会启用。这意味着用户可以继续使用assert()
进行自己的检查,而无需打开标准库检查的开销。由于用于跟踪迭代器有效性的额外数据成员,libstdc++的调试模式还存在二进制兼容性问题。有关详细信息,请参阅
Libc++也有类似的检查,使用不同的宏,VC++在调试版本中自动启用类似的检查。哪些实现没有?GNU如果您定义了< > > GLYBCXXXUDIGUG ,我相信VisualC++可以使用适当的调试设置。我不知道这面旗。。。我的google fu显然让我失望了。哪些实现没有?GNU如果您定义了< > > GLYBCXXXUDIGUG ,我相信VisualC++可以使用适当的调试设置。我不知道这面旗。。。我的谷歌fu显然让我失望了,但显然,libc++还不能工作。但是显然,libc++one还不能工作。