【问题标题】:STL on custom OS - std::list works, but std::vector doesn't自定义操作系统上的 STL - std::list 有效,但 std::vector 无效
【发布时间】:2010-08-18 01:17:32
【问题描述】:

我只是在 Visual Studio 2010 中使用 grub 可引导的 C++ 内核。

我已经到了写新和删除的地步,并且动态分配的数组之类的东西可以工作。例如,我可以使用 STL 列表。在我编写了一个 memcpy 例程之后,我什至可以对它们进行排序。问题是当我使用 std::vector 类型时。只需构造向量即可将内核发送到 la la land。

显然我缺少某种函数实现,但我通过 STL 查找它并空手而归。它在 push_back 处失败:

vector<int> v;
v.push_back(1);

然后消失在以太中。

对我缺少什么有任何猜测吗?

编辑是的,它是 int 的向量。对困惑感到抱歉。不仅如此,它失败的不是构造函数,而是对 push_back 的调用。

【问题讨论】:

  • 我希望你的意思是 vector 什么的……或者“i”是一种类型?
  • 你能否详细介绍一下这个 C++ 内核是什么,一些示例代码,还有其他什么?你写的有点模糊。
  • 它实际上是基于ksrenevasan.blogspot.com/2005/10/… 内存是我学习时目前最简单的方案。它只是从 grub 的 multiboot 结构中获取最大的 base low 到 base high ,然后从该点开始将内容转换到内存中,从 base low 中减去请求的内存量,而 free 什么都不做 - 它就在那里。我知道两者都被适当地调用,如果我使用列表并对它们进行排序,它们都会打印内核消息,说明发生了分配或调用了释放。
  • 我曾经在过时的 Linux + 过时的 GCC + 过时的 STL 上遇到过类似的问题。 v.insert( v.end(), 1 );当时帮了我。

标签: visual-studio-2010 operating-system stdvector visual-c++-2010


【解决方案1】:

暗中刺探:您是否实施了new[]delete[]?列表将使用new 一次创建一个项目,而向量可能会使用new[] 分配更大的内存块。

【讨论】:

  • 可能就是这样。我也看过分配器,但我想你可能已经得到了这个。让我试试看。
  • @jjacksonRIAB 另一个想法,如果你使用 std::vector 会发生什么?我想知道是否可能有 std::vector 的模板专业化。如果有,您的问题可能是特定于专用版本的。
  • @George:啊哈!你说得对。它不是在一个简单的结构上执行的,也不是在一个带有 int 的简单结构上执行的。只是诠释。 Reserve 也适用于简单的结构。我将在 int 的代码中的某处寻找特化,看看它有何不同。
  • @jjacksonRIAB:很高兴我能帮上忙!也许下次我应该将其发布为答案而不是评论:)
  • @George:不过,感谢您的耐心等待。操作系统开发是一种非常简单易懂的交易,至少在你达到可以实际调试的地步之前是这样。你帮助缩小了问题的范围。谢谢! :-)
【解决方案2】:

根据我们上面的讨论,创建一个

std::vector<mySimpleStruct> v;

而不是一个

std::vector<int> v;

似乎可以正常工作。这一定意味着问题出在标准模板库中 std::vector 的某些函数的专门化中。我假设您已经熟悉模板专业化,但如果您不熟悉:

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

另外,一旦你找出真正的问题出在哪里,你能回来在这里发布答案吗?您让我很好奇现在真正的问题在哪里,而且答案可能对尝试构建自己的操作系统内核的其他人有所帮助。

【讨论】:

    【解决方案3】:

    您使用自定义分配器还是默认分配器?

    您可以尝试使用自定义的,只是为了查看哪些分配向量可能会破坏您的内存管理器的实现(这可能是实际失败的原因)。

    是的,请在解决后回帖 - 它可以帮助所有其他 OSdevers。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多