Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么STL实现不使用断言来检测未定义的行为?_C++_Stl_Assert - Fatal编程技术网

C++ 为什么STL实现不使用断言来检测未定义的行为?

C++ 为什么STL实现不使用断言来检测未定义的行为?,c++,stl,assert,C++,Stl,Assert,这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现 基本上,在我看来,STL实现可以添加断言来检测(在运行时)诸如越界访问之类的简单错误。我猜这些访问无论如何在标准中都是未定义的行为,因此打印错误消息和(可选地)中止将符合标准 当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭 作为一个小示例,我希望此代码中止: #include <vector> int main() { return std::vector<int>{1,2}[2];

这是我觉得有用的东西,但我还没有看到在gcc的标准库中实现

基本上,在我看来,STL实现可以添加断言来检测(在运行时)诸如越界访问之类的简单错误。我猜这些访问无论如何在标准中都是未定义的行为,因此打印错误消息和(可选地)中止将符合标准

当然,这些断言可以在编译时通过旧的NDEBUG标志或其他标志关闭

作为一个小示例,我希望此代码中止:

#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还不能工作。