Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>А>>class A
А>>{
А>> public:
А>> A();
А>> ~A();
А>> BOOL Init();
А>> BOOL Start();
А>> .
А>> .
А>> .
А>> private:
А>> vector<B> vec;
А>>};
А>[ кусь ]
А>>A::~A()
А>>{
А>А> vector<B>::iterator iter = vec.begin(); // Этот код не может не падать. ВЕКТОР УДАЛИТ ЭЛЕМЕНТЫ САМ.
А>> while(iter != vec.end())
А>> {
А>> delete iter;
А>> iter++;
А>> }
А>>}
Можно уточнить, вектор удалит элементы сам путём вызова деструктора ~B() или как???
Просто если в B имеет место динамическое выделение памяти, необходимо гарантировать её стопоцентное освобождение???
Да и вопрос остался. Падает только на втором элементе вектора, первый успешно удаляется!
А>>BOOL A::Init(параметры)
А>>{
А>> B *pB;
А>> pB = new B(параметры); // Зачем создавать по new? на стеке тоже пректасно можно создавать элементы.
А>> vec.push_back(*pB); // Я бы написал vec.push_back( B(параметры) );
А>> delete pB;
А>>}
Данный метод - это просто пример для обсуждения, в реально используемом классе нужно было гарантировать правильное создание объекта и инициализацию его параметров, поэтому создаётся динамически. Неудобно, но другого варинта не нашлось, пока....
А>
А>[кусь]
А>>Операторы присваивания и конструкторы копирования класса B написаны и отлично работают.
А>Код
А>B( const B & )
А>const B operator = ( const B & )
А>~B();
А>В студию.
С удовольствием бы выкинул, но пример приводимый тут снят с разрабатываемой модели, а поэтому если выкидывать реализацию операторов, то придётся выкладывать и много сопутсвующего материала
да и ещё
А>const B operator = ( const B & )
не слишком рекомендуется, лучше
B& operator= (const B& rhs), причины хорошо описаны Скотом Мейерсом (см. правило 15).