Форум программистов, компьютерный форум, киберфорум
Наши страницы

Почему кидает SEHException? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не понятная ошибка http://www.cyberforum.ru/cpp-beginners/thread881676.html
Доброго времени суток...))) С++ изучаю второй день, прошу строго не ругать если моя проблема является элементарной, но тем не менее всю ночь просидел в Google и не нашел проблемы. Проблема в коде: ...
C++ Преобразовать текст, заменяя каждое вхождение слова "это" на слово "то" Преобразовать текст, заменяя каждое вхождение слова "это" на слово "то". Как ни бьюсь, но обработка строк мне почему-то не дается, а сдавать завтра. Помогите, плиз! http://www.cyberforum.ru/cpp-beginners/thread881671.html
C++ Данные из одного стека записать в другой в обратном порядке
доброго времени суток! помогите решить задачу по С++. я создал стек, забил значениям... но как при помощи указателей записать все элементы в другой стек, да еще и в обратном порядке - без понятия......
Идеально сбалансированное дерево C++
Здравствуйте, помогите пожалуйста с задачкой, очень нужно... Из входного потока (терминала или файла) поступает текст, состоящий из слов, которые разделены пробелами. Между словами может быть...
C++ Реализовать классы геометрических абстракций: прямоугольник, квадрат http://www.cyberforum.ru/cpp-beginners/thread881634.html
Реализовать классы геометрических абстракций: прямоугольник, квадрат (разрешается использование других классов, помимо перечисленных). Никакой работы с графической подсистемой выполнять не нужно, вся...
C++ Вектор объектов разных классов. Доступ к свойствам элемента вектора есть базовый класс class A { //... } есть производные классы class A1 : public A { //... public: подробнее

Показать сообщение отдельно
Zarc
0 / 0 / 0
Регистрация: 01.02.2012
Сообщений: 11
29.05.2013, 16:32  [ТС]
Ошибку исправил, но до конца не понял, почему она выскакивала. Так как никто не ответил, пишу в чём была причина, может кому поможет.

В методе FirstCWEdgeForFace класса DCEL, с первого поста в цикле сравнивались объекты класса TriangActor, в котором был переопределён operator==() таким образом, что он вызывал operator==() базового класса Node. Привожу код класса TriagActor:

TriagActor.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#pragma once
#ifndef TRIANGACTOR_H
#define TRIANGACTOR_H
 
#include <list>
#include "Node.h"
 
namespace EDM { namespace Model { namespace TriangulationMethod
{
    class TriangActor: public Node
    {
    public:
        //list<Node*> *m_neighbours; // до ошибки был указатель на список указателей
        list<Node*> m_neighbours;
 
        TriangActor();
        TriangActor(CoordT _coordT, Vector2fT _vel, double _radius);
        TriangActor(CoordT _coordT, Vector2fT _vel, double _radius, EventT *_evnt, double _massa = 1.0);
        ~TriangActor();
 
        bool operator==(const TriangActor obj);
 
        static bool CompareByAscendingX(const TriangActor &a, const TriangActor & b)
        {
            return a.coord.x < b.coord.x;
        }
    };
}}}
 
#endif
TriagActor.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "TriangActor.h"
 
using namespace EDM::Model::TriangulationMethod;
 
TriangActor::TriangActor() : Node()
{
    //m_neighbours = new list<Node*>();
}
 
TriangActor::TriangActor(CoordT _coord, Vector2fT _vel, double _radius)
    : Node(_coord, _vel, _radius)
{
    //m_neighbours = new list<Node*>();
}
 
TriangActor::TriangActor(CoordT _coord, Vector2fT _vel, double _radius, EventT *_evnt, double _massa)
    : Node(_coord, _vel, _radius, _evnt, _massa)
{
    //m_neighbours = new list<Node*>();
}
 
TriangActor::~TriangActor()
{
    //delete m_neighbours;
}
 
bool TriangActor::operator==(const TriangActor obj)
{
    return Node::operator ==(obj);
}
Строки до ошибки - закомментированные.
До ошибки в классе был указатель на список указателей, который удалялся в деструкторе.
Так вот, как я понял, при упомянутом выше сравнении в строке

C++
1
if ((*(edges[edgeCntr].fLeft) == face) || (*(edges[edgeCntr].fRight) == face))
неявно дважды создавался объект TriagActor через оператор копирования по-умолчанию (указатели fLeft и fRight, соответственно), а после, при удалении, вызывался деструктор, который удалял указатель m_neighbours. В этом месте как-то портилась куча и блокировалась для размещения в ней в дальнейшем объектов. Поэтому в методе EdgesForFaces с первого поста и нельзя было создать что либо после вызова метода FirstCWEdgeForFace.

Как-то так. Объяснил скорее сам себе, если что понял не так - подскажите, а то до конца не разобрался, почему именно портилась куча (ну удалил указатель, что тут такого...).
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru