【问题标题】:Runtime error accessing a vector访问向量的运行时错误
【发布时间】:2011-04-13 23:38:43
【问题描述】:

在我的 C++ 项目中,我有一个 App 类和一个 Window 类。 App 类有一个参数:vector<Window*>* window;

在 App 的构造函数中,它可以很好地使用和 push_back 一个 Window* 到这个向量上,但是在我的 onMessage() 方法中,它由 WndProc() 调用(我正在使用 winapi),它给了我一个当我尝试使用向量时出现运行时错误。这些是访问错误。

到底出了什么问题?如果您需要更多信息,请尽管询问。

【问题讨论】:

  • 看看一些代码会很有帮助。我唯一可以猜测的是它实际上是指向向量的指针,而不是向量。

标签: c++ memory-management vector runtime-error


【解决方案1】:

要么指向向量的指针无效,要么向量中的指针无效;在这种情况下可能是前者。这在许多情况下都会发生,例如使用指向已被销毁的本地对象的指针。

(顺便说一句:鉴于您在窗口中包含了一个分号,我敢打赌这是一个数据成员而不是一个参数。)

不是在 App 中存储向量指针,而是存储向量本身。与其存储指向 Window 对象的指针,不如存储 Window 对象本身。

struct App {
  vector<Window> windows;
};

但是,这要求 Windows 是可复制的,而它们可能不是。它还不允许存储从 Window 派生的类型的对象。相反,您可以使用 boost::ptr_vector,它“拥有”指向的对象,并在它们被擦除时将其删除(例如当 ptr_vector 被销毁或清除时):

struct App {
  boost::ptr_vector<Window> windows;

  App() {
    // just an example
    windows.push_back(new Window());
    windows.push_back(new DerivedFromWindow());
  }
};

【讨论】:

  • 原来我正在访问一个不存在的对象(指针...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2016-08-03
  • 2010-09-22
相关资源
最近更新 更多