В Visual Studio 2019 C ++, как я могу расширить динамически распределенный массив, чтобы отображались все его элементы? - PullRequest
3 голосов
/ 09 апреля 2020

Я написал простую (и потенциально плохую) реализацию для векторного класса, похожую на std :: vector.

Вот класс:

template <class T>
class Vector
{
    T* data;
    int size;
public:
    Vector(int = 0);
    ~Vector();

    Vector(const Vector<T>&);

    Vector<T>& operator=(Vector<T>);
    T& operator[](int);

    friend void swap(Vector<T>&, Vector<T>&);

    void Clear();
    void Insert(T, int);
    void Delete(int);
    int Size();
};

При отладке кода который использует мой вектор, я заметил, что указатель, который я использую внутренне, обычно расширяется только до первого элемента.

Я нашел этот вопрос SO, Как отобразить динамически распределенный массив в отладчик Visual Studio? , который, кажется, дает простое решение проблемы, но мне интересно, возможно ли расширить массив на непостоянную величину (скажем, текущий размер вектора).

Учитывая, что std :: vector показывает все свои элементы, как правило, внутри отладчика, могу ли я альтернативно переписать свой вектор, чтобы включить эту функциональность?

Вот фрагмент вкладки "Locals" с некоторым тестом переменные, чтобы показать, что я имею в виду:

1 Ответ

2 голосов
/ 10 апреля 2020

Кажется, я нашел, как это сделать, используя файлы .natvis.

В этой статье приводятся дополнительные сведения о файлах Natvis: https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2019

Добавление a. Файл natvis для вашего проекта позволяет вам указать, как контейнер должен отображаться в Locals.

Вот простой пример контейнера Vector, описанного в оригинальном сообщении:

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="AC::Vector&lt;*&gt;">
    <DisplayString>{{ size={size} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">size</Item>
      <ArrayItems>
        <Size>size</Size>
        <ValuePointer>data</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

</AutoVisualizer>

После создания файл и начиная сеанс отладки, контейнер теперь правильно отображает его содержимое:

AC::Vector<int> myVec(3);
myVec[0] = 1;
myVec[1] = 2;
myVec[2] = 3;

Локальные:

enter image description here

...