Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DeadMonk
#1

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

27.05.2013, 21:33. Просмотров 272. Ответов 3
Метки нет (Все метки)

вот, собственно, участок кода

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++
Как исправить такие ошибки? cc1plus: warnings being treated as errors Line 3: warning: ignoring #pragma hdrstop Line 18: error:...

Часто встречающаяся ошибка начинающих наборщиков — дважды записанное слово. В заданном текстовом файле обнаружить и исправить такие ошибки в тексте - C++
Часто встречающаяся ошибка начинающих наборщиков — дважды записанное слово. В заданном текстовом файле обнаружить и исправить такие ошибки...

'arr' was not declared in this scope 'sum' was not declared in this scope такие вот ошибки.( - C++
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main () { setlocale(LC_ALL, "rus"); ...

Булева алгебра, самое сложное что я видел. H E L P Сложность over 90000000% - C++
≡ вот эта закарюка меня пугает,подскажите, что это? и решите пожалуйста задачку Требуется для заданных K N M и X найти количество пар...

Кодировка: как получаются всякие квадратики, нолики и "крякозябры" в файлах? - C++
Я не смог найти подходящий раздел, где могу задать этот вопрос. Как получаются всякие квадратики, нолики и "крякозябры" в файлах,...

Все время устанавливаются нежелательные ПО, такие как Амиго, китайские программы и всякие ненужные ПО - Удаление вирусов
Как то раз я скачал программу CPU Conrol, установил и заметил, что установились такие программы, как Амиго, я почистил все корни Амиго и...

3
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
27.05.2013, 21:39 #2
Цитата Сообщение от DeadMonk Посмотреть сообщение
имеет ли смысл выкладывать код который дальше задействует переменную "te"?
Имеет смысл выложить весь код
0
DeadMonk
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
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
27.05.2013, 22:40 #4
Цитата Сообщение от DeadMonk Посмотреть сообщение
всем спасибо разобрался!
Давно замеченный факт. Когда задаёшь вопрос кому-нибудь другому, то в процессе формулирования вопроса очень часто сам находишь ошибку. Так что в любом случае время было потрачено не зазря
0
27.05.2013, 22:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2013, 22:40
Привет! Вот еще темы с ответами:

Windows 7 64 bit после системного обновления выходят всякие ошибки? - Windows 7
Привет всем: после системного обновления стало жутко тормозить, долгая загрузка, не удалось запустить службы и.тд =( если кто знает...

Возможно ли отключить отображение компьютера в локальной сети? Чтобы комп не видел сам себя, а остальных видел - Администрирование Windows
Локалка на десяток компов, пользователи — классическая бухгалтерия. На каждом компе есть расшареная папка для обмена файлами — набрала...

Из-за чего такие ошибки? - C++ Qt
Запускается /Users/volchkov/build-untitled7-Desktop_Qt_5_7_1_clang_64bit-Debug/untitled7.app/Contents/MacOS/untitled7... Could not parse...

Выдает такие ошибки - C++ Qt
Помогите пожалуйста. Хз почему так. До 14 числа мне нужно с этим разобраться


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru