crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> dynamic_cast Segmetation fault
Count0
  опции профиля:
сообщение 24.8.2013, 16:18
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 30.7.2011
Пользователь №: 2772

Спасибо сказали: 0 раз(а)




Репутация:   0  


В следующем коде:
class Any
{
public:
    class WrongTypeException
    {
    public:
        inline WrongTypeException()
        {
        }
        inline ~WrongTypeException()
        {
        }
    };
public:
    template <typename T>
    inline Any(const T& tValue)
    {
        m_adValue = new TemplateData<T>(tValue);
    }
    template <typename T>
    inline operator T() const
    {
        TemplateData<T>* tdRet = dynamic_cast<TemplateData<T>*>(m_adValue);
        if(tdRet == NULL)
        {
            throw WrongTypeException();
        }
        return tdRet->data();
    }
    inline ~Any()
    {
        delete m_adValue;
    }
protected:
    class AbstractData
    {
    public:
        virtual ~AbstractData()
        {
        }
    protected:
        AbstractData()
        {
        }
    };
    template <typename T>
    class TemplateData : public AbstractData
    {
    public:
        inline TemplateData(const T& tValue)
        {
            m_ptValue = new T(tValue);
        }
        inline T data() const
        {
            return *m_ptValue;
        }
        inline ~TemplateData()
        {
            delete m_ptValue;
        }
    protected:
        T *m_ptValue;
    };
protected:
    AbstractData* m_adValue;
};

При использовании в качестве T непримитивного типа в строке:
TemplateData<T>* tdRet = dynamic_cast<TemplateData<T>*>(m_adValue);

происходит Segmetation fault.
Хотелось бы понять причины и способы устранения.
Благодарю заранее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 24.8.2013, 21:59
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


надо весь код, где и как используется объект, так непонятно, как создавался объект и что привело к падению. обычно к такой ошибке приводит обращение по нулевому(неинициализированному) указателю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Count0
  опции профиля:
сообщение 24.8.2013, 22:50
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 30.7.2011
Пользователь №: 2772

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я только тестиовал данный класс, так что весь пример использования, выдающий ошибку:
    
Any an = 12.4;
double d = an;
an = QPoint(25, 10);
QPoint pnt = an;


И что особенно странно, вот такой код выполняется корректно:
    Any an = QPoint(5, 5);
    QPoint pnt(10, 10);
    pnt += an;

Хотя при повторном присваивании в первом случае должен выполнится сначала деструктор предыдущего экземпляра, потом конструктор нового, если я правильно понимаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 24.8.2013, 23:49
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


добавь оператор присваивания:
template <typename T>
    Any& operator = (const T& tValue)
    {
        m_adValue = new TemplateData<T>(tValue);
    }


но!!! тут вместо new и delete нужно использовать умные указатели, иначе будет утечка памяти. ну либо сделать какой-то метод принудительной очистки типа

void clear()
    {
        if(m_adValue != NULL) {
            delete m_adValue;
            m_adValue = NULL;
       }      
   }


и использовать его после работы с каждым типом, например:
        
        Any an = 12.4;
    double d = an;
    an.clear();
    an = QPoint(10,20);
    QPoint a = an;
    an.clear();


P.S. вообще, это простое следствие Правила Большой Тройки. часто если его не соблюдают, получают такие ошибки.

Сообщение отредактировал Iron Bug - 25.8.2013, 0:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Count0
  опции профиля:
сообщение 25.8.2013, 8:15
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 30.7.2011
Пользователь №: 2772

Спасибо сказали: 0 раз(а)




Репутация:   0  


Благодарю за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.8.2013, 21:13
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а вообще, такой класс any уже есть в boost. так что можно не строить велосипед, а взять готовый.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 7:28