Недопустимое чтение во время обработки событий glfwC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Недопустимое чтение во время обработки событий glfw

Сообщение Anonymous »

Я использую glfw как часть своего приложения. Недавно я запустил Memcheck от Valgrind, который сообщает о недопустимом чтении.

Код: Выделить всё

Invalid read of size 4
at 0x4C3DEF4: pthread_mutex_lock@@GLIBC_2.2.5 (pthread_mutex_lock.c:80)
by 0x51DB32A: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.22.0)
by 0x51DB5DB: wl_display_dispatch_queue_pending (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.22.0)
by 0x171ABE: handleEvents (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x171978: _glfwPollEventsWayland (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x156B05: glfwPollEvents (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11EF64: Hamster::Window::Update(bool) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x119657: Hamster::Application::Run() (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x116EA0: main (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
Address 0x4de7bb8 is 296 bytes inside a block of size 376 free'd
at 0x484B27F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x16BFA4: _glfwTerminateWayland (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x14B6E6: terminate (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x14B7AD: glfwTerminate (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11EEB5: Hamster::Window::~Window() (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11AE8A: std::default_delete::operator()(Hamster::Window*) const (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11ADAF: std::__uniq_ptr_impl::reset(Hamster::Window*) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11A7BC: std::unique_ptr::reset(Hamster::Window*) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x1198E4: Hamster::Application::Close(Hamster::WindowCloseEvent&) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x119D3F: Hamster::Application::Application()::$_0::operator()(Hamster::Event&) const (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x119D01: void std::__invoke_impl(std::__invoke_other, Hamster::Application::Application()::$_0&, Hamster::Event&) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x119C91: std::enable_if::type std::__invoke_r(Hamster::Application::Application()::$_0&, Hamster::Event&) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
Block was alloc'd at
at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x51DE0F3: wl_display_connect_to_fd (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.22.0)
by 0x51DE38D: wl_display_connect (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.22.0)
by 0x16A2E0: _glfwConnectWayland (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x152135: _glfwSelectPlatform (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x14B3ED: glfwInit (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11ECF9: Hamster::Window::Window(Hamster::WindowProps const&) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x11A478: std::_MakeUniq::__single_object std::make_unique(Hamster::WindowProps&) (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x118E48: Hamster::Application::Application() (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
by 0x116CE7: main (in /home/jaden/Documents/dev/Hamster/Hamster-App/Hamster-App)
Окно создается при создании приложения. Окно сохраняется как уникальный указатель как часть класса приложения. Когда glfw вызывает обратный вызов для закрытия окна, я обрабатываю его с помощью Application::Close, который сбрасывает уникальный указатель, уничтожая объект окна. Затем основной цикл работы отключается.

Код: Выделить всё

Application.h

Код: Выделить всё

#pragma once

#include 

#include "Event.h"
#include "Window.h"

#include 

class Application {
private:
bool m_running = true;

std::unique_ptr m_Dispatcher;

std::unique_ptr m_Window;

public:
Application();
~Application();

void Run();
void Close();
};

Код: Выделить всё

Application.cpp

Код: Выделить всё

#include "Application.h"

#include "Base.h"

Application::Application() {
m_Window = std::make_unique();

m_Dispatcher = std::unique_ptr(new EventDispatcher);

m_Window->SetWindowEventDispatcher(m_Dispatcher.get());

m_Dispatcher->Subscribe(FORWARD_CALLBACK_FUNCTION(Application::Close));

glfwSetWindowCloseCallback(
m_Window->GetGLFWWindowPointer(), [](GLFWwindow *windowGLFW) {
EventDispatcher *dispatcher =
(EventDispatcher *)glfwGetWindowUserPointer(windowGLFW);

dispatcher->Post();
});
}

Application::~Application() {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78507334/invalid-read-during-glfw-handling-events[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»