С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 6

Bad allocation || Segmentation fault

10.07.2012, 00:56. Показов 2359. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди, помогите плиз!! голова уже взрывается, но как найти ошибку, не могу понять!! Не могу привести весь пример кода, но на мой взгляд привожу часть, по которой должна быть понятна суть проблемы!

Отрывок из заголовочного файла:

существует вот такая вот структурка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct NumberGroup {
public:
    NumberGroup();
    void AddNumber(const CarNumberInfo &numberInfo, SharedFrameInfo parentFrame_);
 
    CarNumberInfoList numberList;
    boost::posix_time::ptime time;
    boost::shared_ptr<FrameInfo> parentFrame;
    FrameInfo parent;
    //FrameInfo* parentFrame;
    void printGroup();
    CoordArea position;
    bool empty;
};
где CarNumberInfo - также структурка, содержащая 4 поля типа long, SharedFrameInfo - структура, существенно более мощная, но в ней не суть, падает не из за этого..

в .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
class REGISTRATOR_LOCAL CSimilarNumberAnalyzer : public CNumberAnalyzer 
{
public:
    CSimilarNumberAnalyzer() ;
    virtual ~CSimilarNumberAnalyzer() {};
 
    virtual int Initialize();
    virtual int addFrameRecognizedInfo(SharedFrameInfo frameInfo);
    virtual SharedFrameInfoList getProcessedFrameInfo();
    virtual int cleanBuffer();
 
private:
    unsigned int compare(const CarNumberInfo &carNumber1, const CarNumberInfo &carNumber2);
    unsigned int compare(const std::wstring str1, const std::wstring str2);
    unsigned int compareSequence(const std::wstring str1, const std::wstring str2);    
    CarNumberInfo splitNumber(const std::wstring &number, const std::wstring &type);
 
    CarNumberInfo numberAssembly(const NumberGroup &group);
 
    unsigned int minCompare_;        // минимальное количество совпадений в номере
    boost::posix_time::time_duration compareTime_;        // время хранение в секундах
 
    NumberGroupList numbers_;
 
    boost::posix_time::ptime time_; // время последнего кадра
    CTextTranscoder    transcoder;
 
    
 
};
Здесь нас опять таки интересует лишь вектор структур, определенных выше - NumberGroupList



Переходим к файлу .cpp

Структура NumberGroup имеет следующий конструктор -

C++
1
2
3
4
5
6
7
8
NumberGroup::NumberGroup()
{
    position.top = 0;
    position.bottom = 0;
    position.left = 0;
    position.right = 0;
    empty = true;
}
Далее привожу код функции, из за изменения в котором и происходит ошибка, над которой я ломаю голову!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void NumberGroup::AddNumber(const CarNumberInfo &numberInfo, SharedFrameInfo parentFrame_)
{
    assert(parentFrame_!=NULL);
    LOG4CXX_DEBUG(CRegistratorMain::GetLogger(),
            LOG4CXX_STR("NumberGroup::AddNumber. Add number ") << numberInfo.carNumber.baseNumber.c_str());
 
    numberList.push_back(numberInfo);
 
    if ((position.top <= numberInfo.canonicalImageArea.top)) {// && !(50 >       numberInfo.canonicalImageArea.top))
        if(!empty) {
            parent.DeleteSourceImg();
        }
        parent = parentFrame_->Copy();
        empty = false;
        position = numberInfo.canonicalImageArea;
    }
}
ПРОБЛЕМА!!!!!!!!!!
в таком варианте функции программа работает нормально и ниче не падает, работает стабильно, день за днем, неделя за неделей..если же убрать комментарий из условия, то есть условие сложное, ТО
1) в случае если первый параметр передается по ссылке, как написано выше - падает минут через 5-10 - Segmentation fault, причем если поставить логи, то видно, что в эту функцияю и в частности в условие заходит несколько раз
2) в случае передачи по значению и не const - валится минут через 30, по причине Bad_alloc() - terminate called after throwing an instance of 'std::bad_alloc'what(): std::bad_alloc Aborted


Далее привожу код, из которго вызывается данная функция -

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
int CSimilarNumberAnalyzer::addFrameRecognizedInfo(SharedFrameInfo frameRecognizedInfo)
{
    LOG4CXX_DEBUG(CRegistratorMain::GetLogger(),
            LOG4CXX_STR("CSimilarNumberAnalyzer::addFrameRecognizedInfo. Add for analyze"));
 
    
    time_ = frameRecognizedInfo->GetImage().time;
 
    CarNumberInfoList::iterator newCarNumber = frameRecognizedInfo->GetNumInfoList().begin();
    for(; newCarNumber != frameRecognizedInfo->GetNumInfoList().end(); ++newCarNumber) {
        
        LOG4CXX_DEBUG(CRegistratorMain::GetLogger(),
            LOG4CXX_STR("CSimilarNumberAnalyzer::addFrameRecognizedInfo. Add number ") << newCarNumber->carNumber.baseNumber.c_str() << 
            LOG4CXX_STR(" for analyze"));
        
        // поиск наиболее подходящей группы
        NumberGroupList::iterator maxCompareNumber = numbers_.end();  
        unsigned int maxCount= 0;
        if(!numbers_.empty()) {
            NumberGroupList::iterator  numberInfo = numbers_.begin();
            for(;numberInfo != numbers_.end(); ++numberInfo){
                boost::posix_time::ptime timeGroup = numberInfo->time;
                if((time_ - timeGroup) < compareTime_) {
                    
                    // проверяем на совпадения со всеми номерами группы
                    unsigned int maxCompare(0);
                    CarNumberInfoList::iterator num = (*numberInfo).numberList.begin();
                    for(;num < (*numberInfo).numberList.end(); ++num) {
                        unsigned int count =  compare(*num, *newCarNumber);
                        if(count > maxCompare) {
                            maxCompare = count;
                        }
                    }
 
                    if( (maxCompare > maxCount) && maxCompare >= minCompare_){
                        maxCount = maxCompare;
                        maxCompareNumber = numberInfo;                        
                    }    
                }
            }
        }
        
        if(maxCompareNumber != numbers_.end()) {
            LOG4CXX_DEBUG(CRegistratorMain::GetLogger(),
                            LOG4CXX_STR("CSimilarNumberAnalyzer::addFrameRecognizedInfo. Add number ") << newCarNumber->carNumber.baseNumber.c_str() << 
                            LOG4CXX_STR(" to group ") << maxCompareNumber->numberList.back().carNumber.baseNumber.c_str());
            // добавление номера к группе
            maxCompareNumber->AddNumber(*newCarNumber, frameRecognizedInfo);
            maxCompareNumber->time = time_;
            
        } else {
            LOG4CXX_DEBUG(CRegistratorMain::GetLogger(),
                LOG4CXX_STR("CSimilarNumberAnalyzer::addFrameRecognizedInfo. Greate new group with number ") << newCarNumber->carNumber.baseNumber.c_str());
            // создание новой группы номеров
            NumberGroup numberGroup;
            //numberGroup.topPosition = 0;
            numberGroup.time = time_;
            numberGroup.AddNumber(*newCarNumber, frameRecognizedInfo);
            numbers_.push_back(numberGroup);
        }
    }
 
    frameRecognizedInfo->DeleteSourceImg();
 
    LOG4CXX_DEBUG(CRegistratorMain::GetLogger(), LOG4CXX_STR("CSimilarNumberAnalyzer::addFrameRecognizedInfo. Added for analyze "));
 
    //frameRecognizedInfo->DeleteSourceImg();
 
    return 0;
 
}
из этого куска кода понятно, что именно передается этой функции на вход, ибо параметры описаны мною выше!!!


Зубры программирования, помогите плиз в этом вопросе...ведь ту же самую переменную сравниваю с числом, КАК МОЖЕТ ПАДАТЬ!!!!!!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2012, 00:56
Ответы с готовыми решениями:

Segmentation fault
Собственно отрывок кода: my_news.max_news = atoi(sql(&quot;SELECT COUNT(*) FROM t_news WHERE a_id&quot;)); for (int _w = 1; _w &lt;=...

segmentation fault(
#include&lt;time.h&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; int main() { int i,n,str; str=(int)malloc(200); ...

Segmentation fault strcpy()
Почему я получаю ошибку сегментации? char* m_buf; m_buf = (char*)malloc(sizeof(buf)/sizeof(char) + 1); strcpy(m_buf, buf); когда...

8
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
10.07.2012, 09:31
*внутричерепное давление повысилось... у меня* что оно хоть делает? уж очень все переплетенное. кроме того - что то вы не договариваете: с одной стороны заявляете что CarNumberInfo - простая структура из 4-х long, а с другой - мы видим что эта самая простая структура содержит какой то объект canonicalImageArea. кроме того - раз падает на ней, так покажите же ее - зачем другую показывать? а вообще по поводу вопроса - что то удаляется, что то размножается, сверху полито указателями (при размножении нужно отдавать отчет как они будут множится) и динамической памятью (если размножаем или создаем копию или не нужно удалять дважды), не мудрено что падает.
0
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 6
10.07.2012, 11:17  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct RECOGNIZER_LOCAL CarNumberInfo
{
    CarNumber carNumber;
    std::string dSignOfPlateData;           // ЭЦП
    CoordArea canonicalImageArea;           // координаты распознанной области на изображении
    double validity;                        // вероятность 
    size_t countSymbol;                     // количество символов
    std::vector<float> validitySymbol;      // вероятность распознования отдельного символа
    std::wstring sourcePlate;               // исходный вид номера
    std::wstring plateType;                 // тип номера zXXXzzxxx
    std::string country;
    unsigned int countryId;                 // страна
 
public:
    bool operator==(const CarNumber &_carNumber)const {
        return (_carNumber == carNumber);
    };
};

прошу прощения за ложные данные!! Возможно структура и большая по размеру и пусть я предположу, что может раздуваться приложение и падать...но ведь не падает без указанного выше сравнения...я вот это и не могу понять.. как это можно объяснить?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
10.07.2012, 11:43
падать может потому как этим условием цепляет элементы с которыми кто-то еще делает что-то еще. по идее это что-то должно быть операциями с памятью, причем не обязательно вашими - они могут происходить в недрах вектора или строки. а что в CarNumber и CoordArea?
0
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 6
10.07.2012, 11:47  [ТС]
в CarNumber 2 переменных типа string

в CoordArea 4 переменных типа long

Я склонялся к раздутию вектора и повторному обращению, то есть решаить хотел спомощью mutex-ов..но поверьте, дело не в этом..это не разделяемая память..1 элемент передается в функцию AddNumber(), функция отрабатывает и элемент удаляется..благо определен он локально
0
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
10.07.2012, 11:49
Предлагаю не гадать на кофейной гуще а запустить под gdb и когда упадет сказать bt
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
10.07.2012, 13:43
все выглядит нормально. во всяком случае если смотреть на глубину не более разрыва мозга. правда все эти жонглирования элементами вектора настораживают. однако erase нигде нет, увеличения итератора вне for - тоже, не должно падать. что алгоритм делает? может тогда мысль проблескнет?
0
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 6
10.07.2012, 13:49  [ТС]
алгоритм осуществляет выбор оптимального номера - чтобы номер был внизу (т.к. это гарантия того что машина - большая ее часть - попала в картинку) и при этом номер не был обрезан
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
10.07.2012, 14:41
то есть система имеет список номеров на картинке, перебирает их с целью найти самый нижний необрезанный. выглядит просто. зачем тогда все эти конструкции из трехступенчатых циклов на итераторах?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2012, 14:41
Помогаю со студенческими работами здесь

Segmentation fault(Core dumped)
#include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main() { double a, b; a = 12.0; a...

Исправить ошибку, приводящую к segmentation fault
Всеем привет! Можете подсказать, как убрать эту ошибку: Program received signal SIGSEGV, Segmentation fault. 0x00007ffff5f726f6 in...

Segmentation fault в конце работы программы
Есть массив: std::string names; Если в него заносится любое кол-во строк (до 1010), у которых до четырёх символов, всё нормально. Если...

XDestroyImage(image); Segmentation fault (core dumped)
Здравствуйте, подскажите пожалуйста как быть. при вызове функции XDestroyImage(image); происходит крэш программы с ошибкой :Segmentation...

При записи в бинарный файл происходит segmentation fault
Всем доброго времени суток. В узлах дерева находятся структуры pair. #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru