LINUX.ORG.RU

Перестала правильно работать программа

 ,


0

2

Поставил сегодня на комп Ubuntu 14.04 и программа выдает странный баг:

test_fem: /home/zodd/Projects/cpp/femCore2/core/solid8/../../linal/array.h:76: T& linal::Array<T>::operator()(size_t) [with T = double; size_t = long unsigned int]: Assertion `i < height_*width_' failed. Аварийный останов (сделан дамп памяти)

Версия g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2.

Пробовал поставить другую версию g++, не помогло.
До этого была OpenSuse - там нормально работало.

Что может быть причиной, куда копать?

★★★★★

Последнее исправление: Zodd (всего исправлений: 2)

linal/array.h

Твой креатив?

В любом случае, я бы проверил значения i и height_*width_, очевидно же.

Если i слишком драконское, может какой-нибудь коррапшн, который раньше оставался незамеченным, дал о себе знать в 14.04.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Твой креатив?

Да. :)

Еще раз проверил. Программа сегфолтится при инициализации другого класса.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Ну написано же.

Дело в том, что я не пытаюсь получить доступ к массивам, а создаю другой класс.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

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

virtual void PrintToFile(size_t nEl, Matrix &xG, Matrix &yG, Matrix &zG, Matrix &M) = 0;

Затем этот метод реализуется в потомке. Я специально все тело процедуры в нем закомментировал. Эту процедуру нигде не вызываю, а выше показанная ошибка проявляется - чудеса :(

Zodd ★★★★★
() автор топика
Последнее исправление: Zodd (всего исправлений: 1)

Пробовал поставить другую версию g++, не помогло.
До этого была OpenSuse - там нормально работало
Что может быть причиной,

100% - руки

darkenshvein ★★★★★
()
Ответ на: комментарий от darkenshvein

Вот export

Собирал стандартно, без доп опций: cmake ./CmakeLists.txt && make

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

а создаю другой класс

Array<T>::operator()(size_t)

Как бы говорит нам, что вызывается функтор объекта Array<double>. Может у тебя там где-то временный объект пробегает. Моя телепатия уже не справляется.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Закоментировал что мог, вот что осталось (имена классов сократил для наглядности):

class A
{
public:
   A();

   virtual void PrintToFile(size_t nEl, Matrix &xG, Matrix &yG, Matrix &zG, Matrix &M) = 0;
};

class B:public A
{
   B();

   void PrintToFile(size_t nEl, Matrix &xG, Matrix &yG, Matrix &zG, Matrix &M) {};
};

void main() {
B b;
...
Zodd ★★★★★
() автор топика

Assertion `i < height_*width_' failed.

И какие буквы вам непонятны?

andreyu ★★★★★
()
Ответ на: комментарий от Zodd

Закоментировал что мог, вот что осталось (имена классов сократил для наглядности):

Ну и толку от этого листинга? В нем ваш баг не проявляется.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

В общем после дальнейшего копания дошел до следующего. Проблема с инициализацией переменной типа Array без параметров.

Array a1;

Вот сама реализация

template <class T> class Array
{
private:
    size_t height_;
    size_t width_;
    T* data_;
public:
    // constructors
    Array() : height_ (0), width_ (0), data_ (0) {}

    Array(size_t H) : height_ (H), width_ (1), data_ (0) {
        data_ = new T [height_];
    }

    Array(size_t H, size_t W) : height_ (H), width_ (W), data_ (0) {
        data_ = new T [height_*width_];
    }
...
Zodd ★★★★★
() автор топика
Последнее исправление: Zodd (всего исправлений: 1)
Ответ на: комментарий от andreyu

Ок. Постараюсь выпилить все что можно. Теперь даже интересно стало: баг это g++ или что-то трудноуловимое. Самое интересное в других дистрибах все ок.

Zodd ★★★★★
() автор топика
Последнее исправление: Zodd (всего исправлений: 1)
Ответ на: комментарий от Zodd

баг это g++ или что-то трудноуловимое.

99.9% что это ваш баг, а не компилятора.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.