Хранение указателей, принадлежащих auto_ptr, в векторе, вызывающем сбой

У меня возникли проблемы с падением с использованием auto_ptr. Я знаю, что вы не можете хранить auto_ptr в контейнерах STL. Но как насчет хранения значений указателей, содержащихся в auto_ptr внутри вектора? Если auto_ptr удаляет сохраненный объект, на который они указывают, последующее уничтожение вектора, в котором хранятся эти внутренние указатели, приводит к сбою моей программы в методе векторов Tidy_.

ClassA {
public:
ClassA() {
auto_pointer_1_.reset(new ClassP());
auto_pointer_2_.reset(new ClassP());
auto_pointer_3_.reset(new ClassP());
};

std::auto_ptr<ClassP> auto_pointer_1_;
std::auto_ptr<ClassP> auto_pointer_2_;
std::auto_ptr<ClassP> auto_pointer_3_;

};

ClassB {
public:
ClassB(ClassA& a_class_a_) {
vector_of_pointers_.push_back(a_class_a_.auto_pointer_1_.get());
vector_of_pointers_.push_back(a_class_a_.auto_pointer_2_.get());
vector_of_pointers_.push_back(a_class_a_.auto_pointer_3_.get());
};

std::vector<ClassP*> vector_of_pointers_;
};

void main(void) {

ClassA* class_a_variable_ = new ClassA();

ClassB* class_b_variable_ = new ClassB(*class_a_variable_);

delete class_a_variable_;
delete class_b_variable_;  <--- CRASH in std::vector Tidy_ method
}

Может кто-нибудь объяснить мне, почему происходит сбой? Когда auto_ptr удаляет свой сохраненный указатель, связанный указатель в векторе больше не указывает ни на что, но почему это препятствует правильному разрушению вектора?

Спасибо

1

Решение

Как показано, нет проблем с программой, когда заглушка ClassP добавляется, что ничего не делает (и class добавляется, где требуется, и main() изменил, чтобы вернуться int). Поведение, которое вы наблюдаете, может быть связано с повреждением памяти.

Если какой-либо или все ClassA, ClassB или же ClassP на самом деле имеют нетривиальные деструкторы, возможно, что по крайней мере одна из их реализаций деструктора имеет ошибку, которая вызывает неопределенное поведение. Вы должны сосредоточить свое внимание на этом.

Пойми это std::auto_ptr устарела, и вы должны использовать std::unique_ptr вместо этого, как отметил Бен Фойгт.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector