为什么此代码畸形对STL向量的参考访问?

发布于 2025-01-20 01:10:13 字数 1767 浏览 2 评论 0原文

我有一个非常基本的 Cpp 程序:

// tmp.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <set>
#include <iostream>
#include <fstream>
#include <sstream>

#include "viterbi.hpp"

using namespace std;

std::vector<std::vector<size_t>> FindBoundaries()
{
    std::vector<std::vector<size_t>> boundaries = {{1, 2, 3, 5}, {0, 9, 1, 3, 4, 5, 6, 90}, {3, 4, 5, 6, 7, 8, 9}};
    return boundaries;
}

int main()
{
    auto boundaries = FindBoundaries();
    std::cout << boundaries[0].size() << std::endl;
    Viterbi(boundaries[0], boundaries[0]);

    return 1;
}
// viterbi.hpp
#pragma once

#include <functional>

void Viterbi(
    const std::vector<size_t>& observations,
    const std::vector<size_t>& hidden_states);
// viterbi.cpp
#include <algorithm>
#include <map>
#include <iostream>
#include <vector>

std::vector<size_t> Viterbi(
    const std::vector<size_t>& observations,
    const std::vector<size_t>& hidden_states)
{
    std::cout << hidden_states.size() << std::endl;

    return {};
}

如您所见,这是一个非常简单的项目。

当我用 gcc 或 clang 编译它时,我得到这个输出:

4
9

这非常奇怪,它确实应该打印相同的数字两次,此外,如果我使用 gdb 检查 hide_states 的值,我得到这个:

std::vector of length 9, capacity 9 = {4300736, 4300768, 4300768, 4300784, 4300848, 4300848, 4300864, 4300920, 4300920}

但是观察可以吗? 如果我不将此代码拆分为 2 个文件,而是将其保留在一个文件中,则错误不会再发生。

我完全困惑了。

I have, what I think is a very basic Cpp program:

// tmp.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <set>
#include <iostream>
#include <fstream>
#include <sstream>

#include "viterbi.hpp"

using namespace std;

std::vector<std::vector<size_t>> FindBoundaries()
{
    std::vector<std::vector<size_t>> boundaries = {{1, 2, 3, 5}, {0, 9, 1, 3, 4, 5, 6, 90}, {3, 4, 5, 6, 7, 8, 9}};
    return boundaries;
}

int main()
{
    auto boundaries = FindBoundaries();
    std::cout << boundaries[0].size() << std::endl;
    Viterbi(boundaries[0], boundaries[0]);

    return 1;
}
// viterbi.hpp
#pragma once

#include <functional>

void Viterbi(
    const std::vector<size_t>& observations,
    const std::vector<size_t>& hidden_states);
// viterbi.cpp
#include <algorithm>
#include <map>
#include <iostream>
#include <vector>

std::vector<size_t> Viterbi(
    const std::vector<size_t>& observations,
    const std::vector<size_t>& hidden_states)
{
    std::cout << hidden_states.size() << std::endl;

    return {};
}

As you can see this is a very simple project.

When I compile it with either gcc or clang, I am getting this ouput:

4
9

Which is utterly bizarre, it really should be printing the same number twice, moreover if I inspect the values of hidden_states using gdb I get this:

std::vector of length 9, capacity 9 = {4300736, 4300768, 4300768, 4300784, 4300848, 4300848, 4300864, 4300920, 4300920}

But observations is fine?
If I don;t split this code into 2 files and instead keep it in one then the error does not happen anymore.

I am utterly confused.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文