From: Steinar H. Gunderson Date: Mon, 2 May 2016 23:58:02 +0000 (+0200) Subject: Stop leaking memory allocators. X-Git-Tag: 0.4~11 X-Git-Url: https://git.sesse.net/?p=bmusb;a=commitdiff_plain;h=653fb04b1f7fd18a3361524aeb4877efca032cdb Stop leaking memory allocators. --- diff --git a/bmusb.cpp b/bmusb.cpp index 48bdcae..3aac81e 100644 --- a/bmusb.cpp +++ b/bmusb.cpp @@ -782,10 +782,12 @@ libusb_device_handle *open_card(int card_index, string *description) void BMUSBCapture::configure_card() { if (video_frame_allocator == nullptr) { - set_video_frame_allocator(new MallocFrameAllocator(FRAME_SIZE, NUM_QUEUED_VIDEO_FRAMES)); // FIXME: leak. + owned_video_frame_allocator.reset(new MallocFrameAllocator(FRAME_SIZE, NUM_QUEUED_VIDEO_FRAMES)); + set_video_frame_allocator(owned_video_frame_allocator.get()); } if (audio_frame_allocator == nullptr) { - set_audio_frame_allocator(new MallocFrameAllocator(65536, NUM_QUEUED_AUDIO_FRAMES)); // FIXME: leak. + owned_audio_frame_allocator.reset(new MallocFrameAllocator(65536, NUM_QUEUED_AUDIO_FRAMES)); + set_audio_frame_allocator(owned_audio_frame_allocator.get()); } dequeue_thread_should_quit = false; dequeue_thread = thread(&BMUSBCapture::dequeue_thread_func, this); diff --git a/bmusb.h b/bmusb.h index 9ee6617..4c7254b 100644 --- a/bmusb.h +++ b/bmusb.h @@ -177,6 +177,9 @@ class BMUSBCapture : public CaptureInterface { void set_video_frame_allocator(FrameAllocator *allocator) override { video_frame_allocator = allocator; + if (owned_video_frame_allocator.get() != allocator) { + owned_video_frame_allocator.reset(); + } } FrameAllocator *get_video_frame_allocator() override @@ -188,6 +191,9 @@ class BMUSBCapture : public CaptureInterface { void set_audio_frame_allocator(FrameAllocator *allocator) override { audio_frame_allocator = allocator; + if (owned_audio_frame_allocator.get() != allocator) { + owned_audio_frame_allocator.reset(); + } } FrameAllocator *get_audio_frame_allocator() override @@ -251,6 +257,8 @@ class BMUSBCapture : public CaptureInterface { FrameAllocator *video_frame_allocator = nullptr; FrameAllocator *audio_frame_allocator = nullptr; + std::unique_ptr owned_video_frame_allocator; + std::unique_ptr owned_audio_frame_allocator; frame_callback_t frame_callback = nullptr; std::thread dequeue_thread;