Как удалить указатель на вектор указателей в C ++? - PullRequest
0 голосов
/ 12 марта 2020

Допустим, в классе AI есть указатель на вектор, полный указателей на класс B

Class A {
    ....
    std::vector<B *>* table;
    ....
}

Class B {
     int var1;
     int var2;
     B (const int _var1, const int _var2){
          var1 = _var1;
          var2 = _var2;
     }
}

Как я могу go удалить таблицу из класса A в ее деструкторе?

Я пытался

    ~A()
    {
        for (int i = 0; i < table->size(); i++)
        {
            delete (*table)[i];
        }
        delete[] table;
    }

, но по какой-то причине он вызывает ошибку сегмента в деструкторе.

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Ваша ошибка вызвана этой строкой:

delete[] table;

, которая сообщает компилятору, что вы sh хотите удалить массив. table не является массивом, хотя он может действовать аналогично этому, это указатель на одиночный объект в куче и вызов delete[] (вместо delete), следовательно, приводит к неопределенному поведению.

Как правило, никогда не используйте голые указатели. Если вы используете голые указатели, всегда используйте ту же форму для delete, что и для new.

Как указано в комментариях, в современном C ++ у никогда не должно быть контейнера полный голых указателей (голые указатели - это указатели, которые не управляются объектом-оболочкой, использующим RAII).

Поэтому вы должны использовать что-то вроде std::unique_ptr<B> или std::shared_ptr<B> вместо B* в вашем векторе. Вы также не должны иметь указатель std::vector и должны вместо этого скопировать или переместить (если копирование дорогое) вектор на место. Используйте умные указатели вместо голых указателей, и это , мы надеемся, больше не повторится: p.

0 голосов
/ 12 марта 2020

Вы получаете ошибку сегментации из-за оператора delete[] table в вашем деструкторе.

Замените delete[] table; просто delete table;.

...