fix memory leak issue on Transcoder

This commit is contained in:
Nomango 2019-09-26 15:10:28 +08:00
parent c7d2295f4d
commit b1cf985e44
2 changed files with 23 additions and 15 deletions

View File

@ -260,12 +260,15 @@ namespace kiwano
&sample_buffer_length &sample_buffer_length
); );
if (SUCCEEDED(hr) && sample_buffer_length <= max_stream_size) if (position + sample_buffer_length >= max_stream_size)
{ {
for (DWORD i = 0; i < sample_buffer_length; i++) hr = E_FAIL;
{ }
data[position++] = audio_data[i];
} if (SUCCEEDED(hr))
{
::memcpy(data + position, audio_data, sample_buffer_length);
position += sample_buffer_length;
hr = buffer->Unlock(); hr = buffer->Unlock();
} }
} }
@ -281,6 +284,11 @@ namespace kiwano
wave_data_ = data; wave_data_ = data;
wave_size_ = position; wave_size_ = position;
} }
else
{
delete[] data;
data = nullptr;
}
} }
} }

View File

@ -225,12 +225,12 @@ namespace __vector_details
static void copy_data(value_type* dest, size_type count, const value_type& val) { ::memset(dest, (Int32)val, (UInt32)count * sizeof(value_type)); } static void copy_data(value_type* dest, size_type count, const value_type& val) { ::memset(dest, (Int32)val, (UInt32)count * sizeof(value_type)); }
static void move_data(value_type* dest, const value_type* src, size_type count) { if (src == dest) return; ::memmove(dest, src, (UInt32)count * sizeof(value_type)); } static void move_data(value_type* dest, const value_type* src, size_type count) { if (src == dest) return; ::memmove(dest, src, (UInt32)count * sizeof(value_type)); }
static value_type* allocate(size_type count) { return get_allocator().allocate(count); } static value_type* allocate(size_type count) { return get_allocator().allocate(count); }
static void deallocate(value_type*& ptr, size_type count) { if (ptr) { get_allocator().deallocate(ptr, count); ptr = nullptr; } } static void deallocate(value_type*& ptr, size_type count) { if (ptr) { get_allocator().deallocate(ptr, count); ptr = nullptr; } }
static void construct(value_type* ptr, size_type count) { } static void construct(value_type* ptr, size_type count) { }
static void construct(value_type* ptr, size_type count, const value_type& val) { while (count) { --count; *(ptr + count) = val; } } static void construct(value_type* ptr, size_type count, const value_type& val) { while (count) { --count; *(ptr + count) = val; } }
static void destroy(value_type* ptr, size_type count) { } static void destroy(value_type* ptr, size_type count) { }
private: private:
static allocator_type& get_allocator() static allocator_type& get_allocator()
@ -269,12 +269,12 @@ namespace __vector_details
} }
} }
static value_type* allocate(size_type count) { return get_allocator().allocate(count); } static value_type* allocate(size_type count) { return get_allocator().allocate(count); }
static void deallocate(value_type*& ptr, size_type count) { if (ptr) { get_allocator().deallocate(ptr, count); ptr = nullptr; } } static void deallocate(value_type*& ptr, size_type count) { if (ptr) { get_allocator().deallocate(ptr, count); ptr = nullptr; } }
static void construct(value_type* ptr, size_type count) { construct(ptr, count, value_type()); } static void construct(value_type* ptr, size_type count) { construct(ptr, count, value_type()); }
static void construct(value_type* ptr, size_type count, const value_type& val) { while (count) get_allocator().construct(ptr + (--count), val); } static void construct(value_type* ptr, size_type count, const value_type& val) { while (count) get_allocator().construct(ptr + (--count), val); }
static void destroy(value_type* ptr, size_type count) { while (count) get_allocator().destroy(ptr + (--count)); } static void destroy(value_type* ptr, size_type count) { while (count) get_allocator().destroy(ptr + (--count)); }
private: private:
static allocator_type& get_allocator() static allocator_type& get_allocator()