Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Не понятная ошибка http://www.cyberforum.ru/cpp-beginners/thread881676.html
Доброго времени суток...))) С++ изучаю второй день, прошу строго не ругать если моя проблема является элементарной, но тем не менее всю ночь просидел в Google и не нашел проблемы. Проблема в коде: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> int main(int argc, char *argv) { char str;
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  [ТС]     Почему кидает SEHException?
Ошибку исправил, но до конца не понял, почему она выскакивала. Так как никто не ответил, пишу в чём была причина, может кому поможет.

В методе 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.

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