Утечка памяти или переполнение стека?Доктор памяти - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть некоторые проблемы с памятью, возможно, связанные с деструктором следующего класса.

class Menu_Bar{
public:
string name;
float word_width;
Freetype_Font * Font;
Global_Vars * GLOBALS;
unsigned int bar_shader;
unsigned int text_shader;
unsigned int bar_array;
unsigned int bar_buffer;
int bar_no;
int posX;
int posY;
glm::vec3 letter_Color_basic;
glm::vec3 letter_Color_hoover;
glm::vec3 letter_Color_Pressed;
glm::vec3 letter_Color_Active;
unsigned int bar_texture_basic;
unsigned int bar_texture_hoover;
unsigned int bar_texture_pressed;
unsigned int bar_texture_active;
int active;
int pressed;
int hoover;
int released;
int do_not_draw;

Menu_Bar(string set_name, unsigned int set_bar_shader, int set_posX, int set_posY, unsigned int set_bar_texture_basic, unsigned int set_bar_texture_hoover, unsigned int set_bar_texture_pressed, unsigned int set_bar_texture_active, Freetype_Font * set_Font, Global_Vars * set_GLOBALS){
    name= set_name;
    bar_no=1;
    do_not_draw = 0;
    hoover = 0;
    released=0;
    Font= set_Font;
    word_width=text_width(set_name, set_Font);
    bar_shader= set_bar_shader;
    posX= set_posX;
    posY= set_posY;
    GLOBALS= set_GLOBALS;
    bar_texture_basic = set_bar_texture_basic;
    bar_texture_hoover = set_bar_texture_hoover;
    bar_texture_pressed = set_bar_texture_pressed;
    bar_texture_active = set_bar_texture_active;
    letter_Color_basic = glm::vec3(0.9f, 1.0f, 0.1f);
    letter_Color_hoover = glm::vec3(1.0f, 0.0f, 0.5f);
    letter_Color_Pressed = glm::vec3(1.0f, 0.0f, 0.1f);
    letter_Color_Active = glm::vec3(0.0f, 8.0f, 0.1f);
    Load_Arr_QUAD((int)word_width +20, 60, &bar_array, &bar_buffer, GLOBALS);
}
Re_set_bar_width(string set_name){
    name = set_name;
    word_width = text_width(set_name, Font);
    glDeleteBuffers(1, &bar_buffer);
    glDeleteVertexArrays(1, &bar_array);
    Load_Arr_QUAD((int)word_width +20, 60, &bar_array, &bar_buffer, GLOBALS);
}

~Menu_Bar(){
    glDeleteBuffers(1, &bar_buffer);
    glDeleteVertexArrays(1, &bar_array);
}

Menu_Bar(const Menu_Bar &old){
    memcpy(this, &old, sizeof(Menu_Bar));
    Load_Arr_QUAD((int)word_width +20, 60, &bar_array, &bar_buffer, GLOBALS);
}

bool update_bar(){
    if(do_not_draw) return 0;
    released=0;
    if (pressed ==1 && glfwGetMouseButton(GLOBALS->window, GLFW_MOUSE_BUTTON_LEFT)!=GLFW_PRESS)released=1;
    pressed = 0;
    hoover = 0;
    if(Cursor_Over((float)posX - (word_width/2.0f), (float)posY - (float)Font->font_height*0.8f, (float)posX + (word_width/2.0f), (float)posY + (float)Font->font_height*0.8f, GLOBALS->window)){
        if (glfwGetMouseButton(GLOBALS->window, GLFW_MOUSE_BUTTON_LEFT)==GLFW_PRESS){
            draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_pressed, bar_array, GLOBALS);
            draw_text_from_centre(posX, GLOBALS->scr_height - posY -5, word_width, name, Font, letter_Color_Pressed);
            pressed=1;
            active=(active ? 0 : 1);
        }
        else {
            draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_hoover, bar_array, GLOBALS);
            draw_text_from_centre(posX, GLOBALS->scr_height - posY -5, word_width, name, Font, letter_Color_hoover);
            hoover = 1;
        }
    }
    else if (active==1){
        draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_active, bar_array, GLOBALS);
        draw_text_from_centre(posX, GLOBALS->scr_height - posY -5, word_width, name, Font, letter_Color_Active);
    }
    else {
        draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_basic, bar_array, GLOBALS);
        draw_text_from_centre(posX, GLOBALS->scr_height - posY -5, word_width, name, Font, letter_Color_basic);
    }
}

bool update_no_text(){
    if(do_not_draw) return 0;
    hoover = 0;
    released=0;
    if (pressed ==1 && glfwGetMouseButton(GLOBALS->window, GLFW_MOUSE_BUTTON_LEFT)!=GLFW_PRESS)released=1;
    if(Cursor_Over((float)posX - (word_width/2.0f), (float)posY - (float)Font->font_height*0.8f, (float)posX + (word_width/2.0f), (float)posY + (float)Font->font_height*0.8f, GLOBALS->window)){
        if (glfwGetMouseButton(GLOBALS->window, GLFW_MOUSE_BUTTON_LEFT)==GLFW_PRESS){
            draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_pressed, bar_array, GLOBALS);
            active=(active ? 0 : 1);
        }
        else {
            draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_hoover, bar_array, GLOBALS);
            hoover = 1;
        }
    }
    else if (active==1) draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_active, bar_array, GLOBALS);
    else draw_menu_bar(posX, GLOBALS->scr_height - posY, word_width, bar_no, bar_shader, bar_texture_basic, bar_array, GLOBALS);
}
};

Это проблемный вызов в main:

vector <Menu_Bar> Bla_Bar;
for(int c=0; c<2; c++){
    string Bla_name = "Bla " + to_string(Bla_Bar.size());
    Menu_Bar new_Bla_Bar(Bla_name , Menu_shader1, 310 + c*155, 45, main_menu_tex_basic, main_menu_tex_hoover, main_menu_tex_pressed, main_menu_tex_active, &Top_Menu_Font, &GLOBALS);
    new_Bla_Bar.active = 0;
    Bla_Bar.push_back(new_Bla_Bar);
}

Вышеприведенное использование также является единственнымиспользование конструктора копирования в программе.Когда я запускаю программу с отладкой gdb64, отладка будет хорошо проходить через первый цикл, показывающий Bla_name как «Bla 0», затем второй цикл, показывающий Bla_name как «Bla 1», и затем отладка завершится с ошибкой, когда выйдет из цикла, указывающего на деструктор Menu_Bar.Если я прокомментирую, деструктор отладки укажет на класс Menu_Bar (первая строка с объявлением).Когда я «запускаю» программу без отладки, я вижу эти Bla_names как «Bla 1» и «Bla 1» в программе, и я имел обыкновение иметь где-то еще объявленную строку, которая при изменении ее имени менялась над именами.Например, «имя строки» (из Menu_Bar) было одним и тем же кусочком памяти на двух тактах, но остальное было другим.

Я получаю много ошибок: «Ошибка № *: НЕДОСТУПНЫЙ ДОСТУП за вершину стека:»в доктор памяти.Все указывают на одну из 3 строк:

Error #7: UNADDRESSABLE ACCESS beyond top of stack: reading 0x000000000088ee18-0x000000000088ee20 8 byte(s)
# 0 .text               [../../../../../src/gcc-5.1.0/libgcc/config/i386/cygwin.S:146]
# 1 main                [.....cpp:2152]
Note: @0:00:00.527 in thread 2420
Note: 0x000000000088ee18 refers to 4072 byte(s) beyond the top of the stack 0x000000000088fe00
Note: instruction: or     $0x0000000000000000 (%rcx) -> (%rcx)

2152 указывает на main () {

Error #8: UNADDRESSABLE ACCESS beyond top of stack: reading 0x000000000088a000-0x000000000088a008 8 byte(s)
# 0 ntdll.dll!KiUserCallbackDispatcher    +0x0      (0x00007ffc70afdc80 <ntdll.dll+0x9dc80>)
# 1 USER32.dll!SystemParametersInfoW      +0x122    (0x00007ffc701c0713 <USER32.dll+0x20713>)
# 2 glfw3.dll!?                           +0x0      (0x000000006356a31e <glfw3.dll+0xa31e>)
# 3 glfw3.dll!?                           +0x0      (0x0000000063562a4d <glfw3.dll+0x2a4d>)
# 4 main                                   [....cpp:2237]
Note: @0:00:00.552 in thread 2420
Note: instruction: jmp    $0x00007ffbf0c50039

2237 указывает на «if (! GlfwInit ()) return -1;»

GLFWwindow* window;
if(!glfwInit())return -1; 
window=glfwCreateWindow(ScreenWidthGL,ScreenHeightGL,"3d",NULL,NULL);

и последний указывает на последнее закрытие "}" из main () Для меня это первые запуски Dr. Memory.Программа запускается с build & run, но вылетает при некоторых пользовательских событиях.Также ошибка из CodeBlocks:

Program received signal SIGTRAP, Trace/breakpoint trap.
In ntdll!RtlIsNonEmptyDirectoryReparsePointAllowed () (C:\WINDOWS\SYSTEM32\ntdll.dll)
#7  0x00000000004d2f88 in Menu_Bar::~Menu_Bar (this=<error reading variable: Cannot access memory at address 0xbd8000003d822230>, __in_chrg=<optimized out>) at C:/*/
C:/*/:1197:48074:beg:0x4d2f88

Как узнать, превысил ли я стек?Это правильная установка для Dr Memory с точки зрения настройки отладочной информации для скомпилированного файла?Есть ли очевидная ошибка в деструкторе или копирующем конструкторе?

...