gpt4 book ai didi

c++ - GCC 允许我从空字符串中取消引用迭代器

转载 作者:行者123 更新时间:2023-11-30 04:05:26 24 4
gpt4 key购买 nike

我在 GCC 4.8 上运行了以下代码,没有出现(明显的)问题

template<class T>
inline
void remove_carriage_return(std::basic_string<T>& s)
{
static_assert(std::is_same<T, char>::value || std::is_same<T, wchar_t>::value, "Function remove_carriage_return can only accept string or wstring!!\n");

if (*(s.rbegin()) == '\r')
s.pop_back();
}

Visual studio 在运行时崩溃了,当为函数提供一个“”字符串时,因为我试图取消引用指向无效数据的指针(我猜很像取消引用 container.end() 时)。正确的代码应该是:

template<class T>
inline
void remove_carriage_return(std::basic_string<T>& s)
{
static_assert(std::is_same<T, char>::value || std::is_same<T, wchar_t>::value, "Function remove_carriage_return can only accept string or wstring!!\n");

if (s.length() > 0 && *(s.rbegin()) == '\r')
s.pop_back();
}

我的推论正确吗?如果是这样,为什么 GCC 会“优化我的错误”?

最佳答案

期望明确声明为未定义的东西以定义的方式运行是没有意义的。迭代器可以指向任何地方,并且绝对不能保证(也没有理由期望)该内存区域不可访问。

但是,出于性能原因,字符串可以保存与 C 字符串兼容的数据(即以 0 结尾),因此 "" 将是一个字节 (0),因此rbegin 可以指向这个 0 字节。当然它是实现定义的,以及迭代器本身(可以是指针,可以是类)。

关于c++ - GCC 允许我从空字符串中取消引用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23289981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com