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

Всякие ошибки видел , но такие ( - C++

Восстановить пароль Регистрация
 
DeadMonk
Сообщений: n/a
27.05.2013, 21:33     Всякие ошибки видел , но такие ( #1
вот, собственно, участок кода

C++
1
2
3
    printf("[1]\n");
    Iface_TM_Element* te = new Iface_TM_Element[1];
    printf("[2]\n");
при компиляции с режимом Release в VS 2008 все запускается нормально
а при компиляции в режиме Debug консоль выдает следующее-

[1]
[2]
[1]
[2]
[1] - далее вылет

Iface_TM_Element никаких конструкторов не имеет:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Iface_TM_Element
{
    unsigned char type;
    unsigned char size;
    unsigned char slide_pos;
 
    unsigned short rx;      //relative  menu x
    unsigned short ry;      //relative  menu y
    unsigned long command;
 
    char *value;
    Iface_Textmenu* on_hit;
};
никаких строк после [1] и до [2] больше нет.

подскажите пожалуйста, в чем вообще тут может быть проблема, как может вылетать при выделении памяти оператором new? (никогда такого не встречал)
имеет ли смысл выкладывать код который дальше задействует переменную "te"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 21:33     Всякие ошибки видел , но такие (
Посмотрите здесь:

C++ Есть ли такие утилиты.
C++ Есть такие?
Узнать с какими ключами может запускаться программа C++
Такие разные константы C++
C++ Как исправить такие ошибки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
27.05.2013, 21:39     Всякие ошибки видел , но такие ( #2
Цитата Сообщение от DeadMonk Посмотреть сообщение
имеет ли смысл выкладывать код который дальше задействует переменную "te"?
Имеет смысл выложить весь код
DeadMonk
Сообщений: n/a
27.05.2013, 22:08     Всякие ошибки видел , но такие ( #3
кода уж слишком много...

вот что я имею по данному участку:

проблемная функция(отключение которой решает проблему) -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void MAPEDmenu_init()
{
#ifdef _DEBUG
    printf("[~][->][MAPEDmenu_init]\n");
#endif
 
menu_start.Init();
 
menu_start.AddElement(IF_ELID_SEL_TXT,0,"Create new map",0,0,0);
menu_start.AddElement(IF_ELID_SEL_TXT,0,"Load exsisting map",0,0,0);
menu_start.AddElement(IF_ELID_SEL_TXT,0,"Exit",0,0,0);
 
//menu_start.Activate(1);
 
#ifdef _DEBUG
    printf("[~][<-][MAPEDmenu_init]\n");
#endif
}
теперь Iface_Textmenu::AddElement:
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
void Iface_Textmenu::AddElement(unsigned char type,unsigned char size,
                                char* name,Iface_Textmenu* menu,
                                unsigned short rx,unsigned short ry)
{
 
    printf("[1]\n");
    
    Iface_TM_Element* te = new Iface_TM_Element[1];
 
    printf("[2]\n");
 
    
    te->on_hit = menu;
    te->size = size;
    te->slide_pos = 0;
    te->type = type;
    te->rx=rx;
    te->ry=ry;
    te->value = 0;
 
    //free this (TODO)
    if(name == 0)
    {
        if(size > 0)
        {
        te->value = new char[size];
        memset(te->value,0,size);
        }
    }
    else
    {
        te->size = strlen(name) + 1;
        te->value = new char[size];
        strcpy(te->value,name);
        te->value[size] = 0;
    }
 
    
[!!!!!!]this->lst_lbl.NewLink(te); //как выяснилось дальше отключение данной строки уберает вылет программы
    this->lst_lbl.ldata->last->i->command = this->lst_lbl.ldata->total;
    
    //FIRST ELEMENT
    if(this->sel_lbl == 0)
    {
        if((type & 0x0f) != IF_ELID_STA_TXT) //non static - selectable
        {
            this->sel_lbl = this->lst_lbl.ldata->last;
        }
    }
};
реализация this->lst_lbl.NewLink(te); (добавление нового элемента в лист не создавая экземпляр класса T)
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
TList<T>* NewLink(T* t)
{
 
    TList<T>* tl = 0;
    tl = new TList<T>[1]; 
    
    tl->next=0;
    tl->prev=0;
    tl->ldata=this->ldata; 
 
    tl->i=t; // тут не происходит выделение под экземпляр - только присвоение в данном случае переменной "te".
    
    if(this->ldata->total == 0) // 1st item?
    {
 
        tl->ldata->first=tl;
        tl->ldata->last=tl;
    }
    else
    {
        tl->prev=this->ldata->last;
        this->ldata->last->next=tl;
        this->ldata->last=tl;
    }
 
    ++this->ldata->total;
 
    return tl;
}
Добавлено через 18 минут
всем спасибо разобрался!

ошибка вот где:
создается экземпляр класса Iface_TM_Element[1] с именем te;
далее

C++
1
2
3
4
te->size = strlen(name) + 1;
        te->value = new char[size];
        strcpy(te->value,name);
        te->value[size] = 0;
te->value[size] выходит за границы new char[size] и происходит нарушение в памяти;
исправил new char[size] на new char[te->size];
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
27.05.2013, 22:40     Всякие ошибки видел , но такие ( #4
Цитата Сообщение от DeadMonk Посмотреть сообщение
всем спасибо разобрался!
Давно замеченный факт. Когда задаёшь вопрос кому-нибудь другому, то в процессе формулирования вопроса очень часто сам находишь ошибку. Так что в любом случае время было потрачено не зазря
Yandex
Объявления
27.05.2013, 22:40     Всякие ошибки видел , но такие (
Ответ Создать тему
Опции темы

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