0

我有这个unique_ptr在向量中使用的 C++11 代码。

#include <vector>
#include <iostream>
#include <memory>

using namespace std;

class A
{
    int x;
public:
    A() {}
    ~A() {}
    A(A& a) {}
    A(int x) {this->x = x;}
    int get() {return x;}
};

int main()
{
    vector<unique_ptr<A>> v;
    auto a = new A(10);
    unique_ptr<A> pa(a);
    v.push_back(move(pa)); // move(pa);

    auto a2 = new A(20);
    unique_ptr<A> pb(a2);
    v.push_back(move(pb)); // move(pa);

    for (auto& i: v)
    {
        cout << i->get();
    }
}

我可以使用 Xcode 来调试和检查 vector> 中的值。但是,当我在 lldb 中使用 clang 和 debug 编译相同的代码时,会出现两个错误。

在此处输入图像描述

第一个是 lldb 跟踪到 STL 源代码。

* thread #1: tid = 0x1f03, 0x0000000100001744 a.out`__gnu_cxx::__normal_iterator<std::unique_ptr<A, std::default_delete<A> >*, std::vector<std::unique_ptr<A, std::default_delete<A> >, std::allocator<std::unique_ptr<A, std::default_delete<A> > > > >::operator*() const at stl_iterator.h:740, stop reason = step over
    frame #0: 0x0000000100001744 a.out`__gnu_cxx::__normal_iterator<std::unique_ptr<A, std::default_delete<A> >*, std::vector<std::unique_ptr<A, std::default_delete<A> >, std::allocator<std::unique_ptr<A, std::default_delete<A> > > > >::operator*() const at stl_iterator.h:740
   737  
   738        // Forward iterator requirements
   739        reference
-> 740        operator*() const
   741        { return *_M_current; }
   742  
   743        pointer
(lldb) n
Process 41243 stopped

第二个错误是当我尝试查看矢量内容时出现分段错误。

(lldb) p v
Segmentation fault: 11

我使用此命令进行编译。

clang++ -std=c++11 -stdlib=libc++ -g testit.cpp -o a

可能有什么问题?

4

2 回答 2

0

我用 Lion 的最新版本重新安装了 Xcode:Xcode 4.6,问题就消失了。

于 2013-06-23T18:49:15.553 回答
0

您的分段错误似乎可能是由以下两种情况之一引起的:

  • LLDB 表达式解析器
  • LLDB 数据格式化程序

为了分辨哪个是哪个,崩溃日志是必要的。

如果您可以从中检索它~/Library/Logs/DiagnosticReports并将其附加到此问题(并在http://bugreport.apple.com向 Apple 提交错误),这将是一个很好的起点

此外,您似乎使用的是 5 之前的 Xcode。那是对的吗?您是否可以访问 Xcode 5 开发者预览版来测试它是否可以重现?LLDB 在 4.x 和 5 之间得到了极大的改进,所以你可能会有更好的运气。

于 2013-06-23T16:49:04.950 回答