У меня есть некоторые проблемы с памятью, возможно, связанные с деструктором следующего класса.
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 с точки зрения настройки отладочной информации для скомпилированного файла?Есть ли очевидная ошибка в деструкторе или копирующем конструкторе?