【问题标题】:Trying to use std::list in objective-c program尝试在 Objective-C 程序中使用 std::list
【发布时间】:2010-02-14 19:49:10
【问题描述】:

我正在尝试在我的 Objective-C 程序中使用 std::list 并遇到运行时问题。

我有(为简洁起见编辑)

 #import <list>

 ...

 @interface Foo {
    std::list<Bar *> *myList;
 }

 ...

 @implementation Foo

 -(void)loopList {

   myList = new std::list<Bar *>;

   for (std::list<Bar *>::iterator ii; ii != myList->end(); ++ii) 
   {
      // Do nothing here
   }
 }

一切都编译得很好,但是在执行 for 循环时我得到了 EXC_BAD_ACCESS。我没有对内容做任何事情,只是循环播放它们(现在)。

我会使用 NSMultableArray,但我需要在迭代时快速插入和删除元素,这是不可能的。另外,我想使用 stl 来解决速度问题。

我的文件设置为 sourcecode.cpp.objcpp。

提前致谢。

【问题讨论】:

  • 请记住(和 AFAIK)stl::list 不会在您将对象添加到列表时保留它们,因此如果您要添加 NSObject 派生类,请确保它们的保留计数足够在运行循环中存活。

标签: objective-c list stl


【解决方案1】:

这一行:

for (std::list<Bar *>::iterator ii; ii != myList->end(); ++ii) 

需要成为:

for (std::list<Bar *>::iterator ii = myList->begin(); ii != myList->end(); ++ii) 

在您的版本中,ii 从未分配过值,因此它没有可迭代的内容。根据您发布的代码尚不清楚原因,但因此您稍后尝试取消引用无效的内存地址,这就是您生成异常 (EXC_BAD_ACCESS) 的原因。

【讨论】:

  • myList 是一个指针,而 ii 是一个迭代器对象,有一个构造函数,而不仅仅是“随机内存”。
  • 谢谢,添加 ii = myList->begin() 解决了这个问题。不知道为什么我错过了!
  • @Neil:作为迭代器并不能保证构造函数,构造函数的存在也不能保证任何东西的初始化!
  • @Neil:ii 仅包含堆栈中分配位置的值。它不是一个有效的对象。否则他为什么会收到EXC_BAD_ACCESS 错误?
  • C++ 标准 12.1.9 说:“默认构造函数被隐式调用以创建静态或自动存储持续时间的类对象 [...] 没有初始化器定义。”。
【解决方案2】:

我不了解目标 C,但在 C++ 中,您需要告诉迭代器它正在迭代哪个列表实例:

for (std::list<Bar *>::iterator ii = myList->begin(); 
                  ii != myList->end(); ++ii) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2011-07-23
    • 2023-03-19
    相关资源
    最近更新 更多