2014-11-27 2 views
0

У меня есть объект структуры, которая имеет несколько виртуальных функцийперекрываться Виртуальная функция не называется

object.h

struct object { 
public: 
    ... 
    virtual float intersect(Point, Vector, object*, Point*); 
    virtual Vector normal(Point, object*); 
}; 

и они реализуются в другой структуре называется сферой

sphere.h

struct sphere: public object { 
     ... 
     // intersect ray with sphere 
     float intersect(Point, Vector, object*, Point*) override; 
     // return the unit normal at a point on sphere 
     Vector normal(Point, object*) override; 
    }; 

I и создавать и хранить указатели на сферы в векторе через

extern vector<object*> scene; 
sphere *new_sphere; 
new_sphere = (sphere *) malloc(sizeof(sphere)); 
... 
scene.push_back(new_sphere); 

Так что проблема происходит, когда я пытаюсь вызова пересекаются со следующим кодом

extern std::vector<object*> scene; 
... 
object *intersect_scene(Point p, Vector u, Point *intersect, int ignore) { 
    for (vector<object*>::iterator it = scene.begin(); it != scene.end(); ++it) { 
      float intersect_point = (*it)->intersect(p, u, *it, &temp_hit); 
    } 

я получаю следующее сообщение об ошибке с помощью GDB

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004042ef in intersect_scene (p=..., u=..., intersect=0x7fffffffdcd0, 
    ignore=-1) at trace.cpp:70 
70   float intersect_point = (*it)->intersect(p, u, *it, &temp_hit); 

Может кто-то дать мне некоторое представление о том, что здесь?

по запросу:

struct Point{ 
    float x; 
    float y; 
    float z; 
}; 

struct Vector{ 
    float x; 
    float y; 
    float z; 
}; 
+0

«Может кто-нибудь дать мне некоторое представление о том, что здесь происходит?» Мы не знаем, где, когда и как этот код вызывается, мы не знаем состояния любой из этих переменных, которые вы вызов и т. д. Излишне говорить, что вам нужно изолировать проблему и придумать полный пример, который показывает ошибку. Поскольку вы используете указатели и динамически распределенную память, очевидная причина связана с неправильным управлением памятью/указателем где-то в вашем приложении. – PaulMcKenzie

+1

Что такое 'Point'? Что такое «Вектор»? Вы передаете их по значению (по крайней мере, это то, что предлагает этот код). Это означает, что у них лучше работают рабочие копии, которые выполняют правильные копии. – PaulMcKenzie

+0

Точка и векторы - две структуры. Я надеялся, что это будет так просто, как ваш итератор неверен – Wusiji

ответ

3

Не используйте malloc для создания объектов, не POD. Вместо этого используйте new.

Все malloc is is allocate bytes - не объекты конструкции. Объект sphere имеет виртуальные функции, получен из базового класса и т. Д. Эти типы должны быть правильно построены, а malloc не выполняет эту работу.

Кроме того, если у вас есть звонки на номер free(), их также необходимо изменить, чтобы позвонить по телефону delete.

Единственный раз, когда вы используете malloc с точки зрения построения объекта, вы используете placement-new, который ваш код не делает.

+0

Так что я должен использовать 'new_sphere = new sphere'? – Wusiji

+0

Да, используйте 'new' (хотя это может иметь проблемы с дизайном, но это уже другая история). Использование 'malloc' было определенно неправильным. – PaulMcKenzie

Смежные вопросы