为什么vector.erase()遇到sigabrt
Why does vector.erase() run into SIGABRT?
我的filepath归一化功能有一个奇怪的问题,我没有完全理解并且难以修复(我在c 中也不是很经验)。
/**
* Converts any path (e.g. /a/d/../b/.//c/) to absolute /a/b/c format.
* @param path Any valid path beginning with /
* @return Path in absolute /a/b/c format.
*/
static std::string normalizePath(std::string path)
{
if (path == "/")
return "/";
if (path[0] != '/') // full relative paths not supported due to lack of context
return "";
std::vector<std::string> segments = strsplit(path, '/');
while (segments[0] == "." || segments[0] == "..")
segments.erase(segments.begin());
for (int i = 0; i < segments.size(); i++)
{
if (segments[i] == "." || segments[i].empty())
segments.erase(segments.begin() + (i--));
else if (segments[i] == "..")
segments.erase(segments.begin() + (--i), segments.begin() + (i+2)); // SIGABRT
}
std::string r;
for (int i = 0; i < segments.size(); i++)
r += "/" + segments[i];
return r;
}
与大多数输入一起工作正常,但是输入"/a/.."
(应该返回"/"
)使其在指示的行中与SIGABRT
崩溃。
我的理解是我正在删除当前和上一个元素,但显然假设是错误的。
我也不愿意使用realpath()
,因为我正在使用虚拟路径,而且我绝对不希望对任何文件系统进行任何调用。
为什么我的代码崩溃?我如何使其按预期工作?
此行的行为不确定,因为它在彼此之间未访问访问的上下文中访问i
:
segments.erase(segments.begin() + (--i), segments.begin() + (i+2));
由于未指定评估顺序,并且应用副作用的顺序尚不清楚,因此segments.begin() + (i+2)
可以评估到迭代器上方的迭代器。
您可以在不预先启动的情况下使用i
的值来解决此问题,并在从erase
返回后应用--
:
else if (segments[i] == "..") {
segments.erase(std::next(segments.begin(), i-1), std::next(segments.begin(), i+1));
--i;
}
注意:上面的代码使用std::next
而不是向迭代器添加数字。
相关文章:
- 编译包含字符串的代码时遇到问题
- 遇到新行时,有没有办法停止istream_iterator
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 在 for 循环中查找问题时遇到困难
- 创建结构的数组时遇到分段错误
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 为什么我遇到分段错误?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 如何从文本文件中读取数值,直到遇到字符类型?
- 从其他类访问类时遇到问题
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 打印问题.我在数组中打印值时遇到一些问题
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 使用静态成员声明类时遇到问题
- 创建 Spdlog 异步文件记录器时遇到困难
- 当我的代码工作正常时,为什么在SPOJ中遇到运行时(Sigabrt)错误
- 为什么vector.erase()遇到sigabrt