2015-04-12 1 views
1

Например, у меня есть такая структура в шаблонном классе:Доступ векторных элементов в GDB

struct Foo{ 
    int data; 
    vector<Foo*> children; 
} 

И распечатать значение данных, я могу просто сделать это: (пусть bar быть указателем на Foo)

print bar->data 

, и это работает нормально. Однако я хотел бы также следовать children другому Foo. Я пробовал:

print bar->children[0]->data 

но не работает. Как получить доступ к элементам в векторе и использовать его в print?

ответ

0

С помощью this answer, явно инстанцировании вектор исправляет эту проблему.

1

С GDB 7.9 и g ++ 4.9.2 он хорошо работает при печати bar->children[0]->data.

Но здесь также косвенный метод для доступа к этим элементам: print (*(bar->children._M_impl._M_start)@bar->children.size())[0]->data где VECTOR._M_impl._M_start является внутренним массивом VECTOR и [email protected]() используются для ограничения размера указателя.

ссылка: How do I print the elements of a C++ vector in GDB?

комплемента:

Существует также еще не так элегантно, но более общий способ:

print bar->children[0]

и вы могли бы получить что-то вроде этого:

(__gnu_cxx::__alloc_traits<std::allocator<Foo*> >::value_type &) @0x603118: 0x603090

так что вы можете получить доступ к нему с указателем приведенного выше: print ((Foo)*0x603090).data

+0

Я получаю сообщение об ошибке «Нет члена или метода с именем _M_impl.» Вероятно, это потому, что я использую clang ++ вместо g ++. –

+0

Так я могу знать вашу среду? Поскольку доступ к внутреннему массиву векторов тесно зависит от реализации компиляторов ... – Tom

+0

Clang ++, libC++, C++ 14 без оптимизации. –