diff --git a/libobs-opengl/gl-indexbuffer.c b/libobs-opengl/gl-indexbuffer.c
index 992ca13850ff531c95b121cfe72f50742755c0ec..7bb2a710542f81a22215d700b0716042befa9596 100644
--- a/libobs-opengl/gl-indexbuffer.c
+++ b/libobs-opengl/gl-indexbuffer.c
@@ -37,9 +37,8 @@ indexbuffer_t device_create_indexbuffer(device_t device,
 		enum gs_index_type type, void *indices, size_t num,
 		uint32_t flags)
 {
-	struct gs_index_buffer *ib = bmalloc(sizeof(struct gs_index_buffer));
+	struct gs_index_buffer *ib = bzalloc(sizeof(struct gs_index_buffer));
 	size_t width = type == GS_UNSIGNED_LONG ? sizeof(long) : sizeof(short);
-	memset(ib, 0, sizeof(struct gs_index_buffer));
 
 	ib->device  = device;
 	ib->data    = indices;
diff --git a/libobs-opengl/gl-shader.c b/libobs-opengl/gl-shader.c
index bf4e763626e8daf9da4419410a9ae8f502f8889b..e42c2d1b1d0549235bfb5e087ca684d395214e79 100644
--- a/libobs-opengl/gl-shader.c
+++ b/libobs-opengl/gl-shader.c
@@ -48,8 +48,7 @@ static void gl_get_program_info(GLuint program, const char *file,
 	if (!gl_success("glGetProgramiv") || !info_len)
 		return;
 
-	errors = bmalloc(info_len+1);
-	memset(errors, 0, info_len+1);
+	errors = bzalloc(info_len+1);
 	glGetProgramInfoLog(program, info_len, &chars_written, errors);
 	gl_success("glGetProgramInfoLog");
 
@@ -238,11 +237,10 @@ static bool gl_shader_init(struct gs_shader *shader,
 static struct gs_shader *shader_create(device_t device, enum shader_type type,
 		const char *shader_str, const char *file, char **error_string)
 {
-	struct gs_shader *shader = bmalloc(sizeof(struct gs_shader));
+	struct gs_shader *shader = bzalloc(sizeof(struct gs_shader));
 	struct gl_shader_parser glsp;
 	bool success = true;
 
-	memset(shader, 0, sizeof(struct gs_shader));
 	shader->device = device;
 	shader->type   = type;
 
diff --git a/libobs-opengl/gl-stagesurf.c b/libobs-opengl/gl-stagesurf.c
index e173d8aa3c3acfbfc7c9b5971cb048426cde7f8d..43ba9d90b43b6cc805ac6485aeade55f7b907992 100644
--- a/libobs-opengl/gl-stagesurf.c
+++ b/libobs-opengl/gl-stagesurf.c
@@ -69,9 +69,7 @@ stagesurf_t device_create_stagesurface(device_t device, uint32_t width,
 		uint32_t height, enum gs_color_format color_format)
 {
 	struct gs_stage_surface *surf;
-	surf = bmalloc(sizeof(struct gs_stage_surface));
-	memset(surf, 0, sizeof(struct gs_stage_surface));
-
+	surf = bzalloc(sizeof(struct gs_stage_surface));
 	surf->format             = color_format;
 	surf->width              = width;
 	surf->height             = height;
diff --git a/libobs-opengl/gl-subsystem.c b/libobs-opengl/gl-subsystem.c
index 7602a5d6727f78e73de0b8f1a6293f183004341a..a8a7db77999189b84b9838500d4d22b14d969e5e 100644
--- a/libobs-opengl/gl-subsystem.c
+++ b/libobs-opengl/gl-subsystem.c
@@ -169,8 +169,7 @@ void convert_sampler_info(struct gs_sampler_state *sampler,
 
 device_t device_create(struct gs_init_data *info)
 {
-	struct gs_device *device = bmalloc(sizeof(struct gs_device));
-	memset(device, 0, sizeof(struct gs_device));
+	struct gs_device *device = bzalloc(sizeof(struct gs_device));
 
 	device->plat = gl_platform_create(device, info);
 	if (!device->plat)
@@ -219,8 +218,7 @@ void device_destroy(device_t device)
 
 swapchain_t device_create_swapchain(device_t device, struct gs_init_data *info)
 {
-	struct gs_swap_chain *swap = bmalloc(sizeof(struct gs_swap_chain));
-	memset(swap, 0, sizeof(struct gs_swap_chain));
+	struct gs_swap_chain *swap = bzalloc(sizeof(struct gs_swap_chain));
 
 	swap->device = device;
 	swap->info   = *info;
@@ -273,8 +271,7 @@ samplerstate_t device_create_samplerstate(device_t device,
 {
 	struct gs_sampler_state *sampler;
 
-	sampler = bmalloc(sizeof(struct gs_sampler_state));
-	memset(sampler, 0, sizeof(struct gs_sampler_state));
+	sampler = bzalloc(sizeof(struct gs_sampler_state));
 	sampler->device = device;
 	sampler->ref    = 1;
 
diff --git a/libobs-opengl/gl-texture2d.c b/libobs-opengl/gl-texture2d.c
index 6569bf6ac10f536eaa686b27020f4117bc0193f9..368191ef5fb91d35389e76fd319e9f23b841ff82 100644
--- a/libobs-opengl/gl-texture2d.c
+++ b/libobs-opengl/gl-texture2d.c
@@ -78,9 +78,7 @@ texture_t device_create_texture(device_t device, uint32_t width,
 		uint32_t height, enum gs_color_format color_format,
 		uint32_t levels, const void **data, uint32_t flags)
 {
-	struct gs_texture_2d *tex = bmalloc(sizeof(struct gs_texture_2d));
-	memset(tex, 0, sizeof(struct gs_texture_2d));
-
+	struct gs_texture_2d *tex = bzalloc(sizeof(struct gs_texture_2d));
 	tex->base.device             = device;
 	tex->base.type               = GS_TEXTURE_2D;
 	tex->base.format             = color_format;
diff --git a/libobs-opengl/gl-texturecube.c b/libobs-opengl/gl-texturecube.c
index 70d96bc473e68464dae65930fd52c36a636ebc4e..e3935005e6b495ab36a4e92e91d958bcdead9715 100644
--- a/libobs-opengl/gl-texturecube.c
+++ b/libobs-opengl/gl-texturecube.c
@@ -62,9 +62,7 @@ texture_t device_create_cubetexture(device_t device, uint32_t size,
 		enum gs_color_format color_format, uint32_t levels,
 		const void **data, uint32_t flags)
 {
-	struct gs_texture_cube *tex = bmalloc(sizeof(struct gs_texture_cube));
-	memset(tex, 0, sizeof(struct gs_texture_2d));
-
+	struct gs_texture_cube *tex = bzalloc(sizeof(struct gs_texture_cube));
 	tex->base.device             = device;
 	tex->base.type               = GS_TEXTURE_CUBE;
 	tex->base.format             = color_format;
diff --git a/libobs-opengl/gl-vertexbuffer.c b/libobs-opengl/gl-vertexbuffer.c
index b158a7fb5bd33537bf7a52239a5591029afbc0d0..73d75b2944e176f7c894b95477cb4d19b84a9231 100644
--- a/libobs-opengl/gl-vertexbuffer.c
+++ b/libobs-opengl/gl-vertexbuffer.c
@@ -79,9 +79,7 @@ static bool create_buffers(struct gs_vertex_buffer *vb)
 vertbuffer_t device_create_vertexbuffer(device_t device,
 		struct vb_data *data, uint32_t flags)
 {
-	struct gs_vertex_buffer *vb = bmalloc(sizeof(struct gs_vertex_buffer));
-	memset(vb, 0, sizeof(struct gs_vertex_buffer));
-
+	struct gs_vertex_buffer *vb = bzalloc(sizeof(struct gs_vertex_buffer));
 	vb->device  = device;
 	vb->data    = data;
 	vb->num     = data->num;
diff --git a/libobs-opengl/gl-windows.c b/libobs-opengl/gl-windows.c
index 2be96f4145861e26d13e0d8763ae3374fbc2441c..9f86e7d5ac7266e7cab231d740c1d646ef006326 100644
--- a/libobs-opengl/gl-windows.c
+++ b/libobs-opengl/gl-windows.c
@@ -337,11 +337,10 @@ static inline bool gl_setpixelformat(HDC hdc, int format,
 
 static struct gl_windowinfo *gl_windowinfo_bare(struct gs_init_data *info)
 {
-	struct gl_windowinfo *wi = bmalloc(sizeof(struct gl_windowinfo));
-	memset(wi, 0, sizeof(struct gl_windowinfo));
-
+	struct gl_windowinfo *wi = bzalloc(sizeof(struct gl_windowinfo));
 	wi->hwnd = info->window.hwnd;
 	wi->hdc  = GetDC(wi->hwnd);
+
 	if (!wi->hdc) {
 		blog(LOG_ERROR, "Unable to get device context from window");
 		bfree(wi);
@@ -375,12 +374,11 @@ void gl_update(device_t device)
 struct gl_platform *gl_platform_create(device_t device,
 		struct gs_init_data *info)
 {
-	struct gl_platform *plat = bmalloc(sizeof(struct gl_platform));
+	struct gl_platform *plat = bzalloc(sizeof(struct gl_platform));
 	struct dummy_context dummy;
 	int pixel_format;
 	PIXELFORMATDESCRIPTOR pfd;
 
-	memset(plat, 0, sizeof(struct gl_platform));
 	memset(&dummy, 0, sizeof(struct dummy_context));
 
 	if (!gl_dummy_context_init(&dummy))
diff --git a/libobs-opengl/gl-x11.c b/libobs-opengl/gl-x11.c
index b613ee353d536d1264a61297d6b63f9a69244d0e..4abd119fd891c3275c49a2147f4885a92f930a09 100644
--- a/libobs-opengl/gl-x11.c
+++ b/libobs-opengl/gl-x11.c
@@ -57,9 +57,7 @@ extern struct gs_swap_chain *gl_platform_getswap(struct gl_platform *platform)
 
 extern struct gl_windowinfo *gl_windowinfo_create(struct gs_init_data *info)
 {
-	struct gl_windowinfo *wi = bmalloc(sizeof(struct gl_windowinfo));
-	memset(wi, 0, sizeof(struct gl_windowinfo));
-
+	struct gl_windowinfo *wi = bzalloc(sizeof(struct gl_windowinfo));
 	wi->id = info->window.id;
 	/* wi->display = info->window.display; */
 
@@ -108,13 +106,11 @@ struct gl_platform *gl_platform_create(device_t device,
 	int num_configs = 0;
 	int error_base = 0, event_base = 0;
 	Display *display = XOpenDisplay(NULL); /* Open default screen */
-	struct gl_platform *plat = bmalloc(sizeof(struct gl_platform));
+	struct gl_platform *plat = bzalloc(sizeof(struct gl_platform));
 	GLXFBConfig* configs;
 
 	print_info_stuff(info);
 
-	memset(plat, 0, sizeof(struct gl_platform));
-
 	if (!display) {
 		blog(LOG_ERROR, "Unable to find display. DISPLAY variable "
 		                "may not be set correctly.");
diff --git a/libobs-opengl/gl-zstencil.c b/libobs-opengl/gl-zstencil.c
index ae35a21dc01e8fff97ef2af8ddba9f74eb73ab6c..14c8bd8262da91e83ded77d9e5a405b579a2536f 100644
--- a/libobs-opengl/gl-zstencil.c
+++ b/libobs-opengl/gl-zstencil.c
@@ -53,8 +53,7 @@ zstencil_t device_create_zstencil(device_t device, uint32_t width,
 {
 	struct gs_zstencil_buffer *zs;
 
-	zs = bmalloc(sizeof(struct gs_zstencil_buffer));
-	memset(zs, 0, sizeof(struct gs_zstencil_buffer));
+	zs = bzalloc(sizeof(struct gs_zstencil_buffer));
 	zs->format     = convert_zstencil_format(format);
 	zs->attachment = get_attachment(format);
 	zs->device     = device;
diff --git a/libobs/graphics/graphics.c b/libobs/graphics/graphics.c
index 034200438296da96646e9ddb7615facd64aee85d..1029101a25d804d283eaebc48222b75714611882 100644
--- a/libobs/graphics/graphics.c
+++ b/libobs/graphics/graphics.c
@@ -111,8 +111,7 @@ int gs_create(graphics_t *pgraphics, const char *module,
 {
 	int errcode = GS_ERROR_FAIL;
 
-	graphics_t graphics = bmalloc(sizeof(struct graphics_subsystem));
-	memset(graphics, 0, sizeof(struct graphics_subsystem));
+	graphics_t graphics = bzalloc(sizeof(struct graphics_subsystem));
 	pthread_mutex_init_value(&graphics->mutex);
 
 	graphics->module = os_dlopen(module);
@@ -571,11 +570,10 @@ effect_t gs_create_effect_from_file(const char *file, char **error_string)
 effect_t gs_create_effect(const char *effect_string, const char *filename,
 		char **error_string)
 {
-	struct gs_effect *effect = bmalloc(sizeof(struct gs_effect));
+	struct gs_effect *effect = bzalloc(sizeof(struct gs_effect));
 	struct effect_parser parser;
 	bool success;
 
-	memset(effect, 0, sizeof(struct gs_effect));
 	effect->graphics = thread_graphics;
 
 	ep_init(&parser);
diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h
index 6507532ea91bdcba223ed5d08c5cbb7f687cea33..05f34bd24e3772c1d422bf7440832998e5ec742a 100644
--- a/libobs/graphics/graphics.h
+++ b/libobs/graphics/graphics.h
@@ -186,9 +186,7 @@ struct vb_data {
 
 static inline struct vb_data *vbdata_create(void)
 {
-	struct vb_data *vbd = (struct vb_data*)bmalloc(sizeof(struct vb_data));
-	memset(vbd, 0, sizeof(struct vb_data));
-	return vbd;
+	return (struct vb_data*)bzalloc(sizeof(struct vb_data));
 }
 
 static inline void vbdata_destroy(struct vb_data *data)
diff --git a/libobs/graphics/texture-render.c b/libobs/graphics/texture-render.c
index 16480fd597ce7231f799fbae4ce9548e43c22699..65443e201d36d03a0f0072b564b84190919668fd 100644
--- a/libobs/graphics/texture-render.c
+++ b/libobs/graphics/texture-render.c
@@ -39,9 +39,7 @@ texrender_t texrender_create(enum gs_color_format format,
 		enum gs_zstencil_format zsformat)
 {
 	struct gs_texture_render *texrender;
-	texrender = bmalloc(sizeof(struct gs_texture_render));
-	memset(texrender, 0, sizeof(struct gs_texture_render));
-
+	texrender = bzalloc(sizeof(struct gs_texture_render));
 	texrender->format   = format;
 	texrender->zsformat = zsformat;
 
diff --git a/libobs/media-io/audio-io.c b/libobs/media-io/audio-io.c
index e35cb89031d5fe1c7a381ad1525686831a19732d..4935210752c42dc4f62be31656eb6a8896bf9368 100644
--- a/libobs/media-io/audio-io.c
+++ b/libobs/media-io/audio-io.c
@@ -364,8 +364,7 @@ int audio_output_open(audio_t *audio, struct audio_output_info *info)
 	if (!valid_audio_params(info))
 		return AUDIO_OUTPUT_INVALIDPARAM;
 
-	out = bmalloc(sizeof(struct audio_output));
-	memset(out, 0, sizeof(struct audio_output));
+	out = bzalloc(sizeof(struct audio_output));
 
 	memcpy(&out->info, info, sizeof(struct audio_output_info));
 	pthread_mutex_init_value(&out->line_mutex);
@@ -426,8 +425,7 @@ void audio_output_close(audio_t audio)
 
 audio_line_t audio_output_createline(audio_t audio, const char *name)
 {
-	struct audio_line *line = bmalloc(sizeof(struct audio_line));
-	memset(line, 0, sizeof(struct audio_line));
+	struct audio_line *line = bzalloc(sizeof(struct audio_line));
 	line->alive = true;
 	line->audio = audio;
 
diff --git a/libobs/media-io/audio-resampler-ffmpeg.c b/libobs/media-io/audio-resampler-ffmpeg.c
index f55214e8c2485c4267f7a6ffef285b108ad04551..17a46a5c79e155a915e9a6cc4ec2e99f9ec138e7 100644
--- a/libobs/media-io/audio-resampler-ffmpeg.c
+++ b/libobs/media-io/audio-resampler-ffmpeg.c
@@ -80,10 +80,9 @@ static inline uint64_t convert_speaker_layout(enum speaker_layout layout)
 audio_resampler_t audio_resampler_create(const struct resample_info *dst,
 		const struct resample_info *src)
 {
-	struct audio_resampler *rs = bmalloc(sizeof(struct audio_resampler));
+	struct audio_resampler *rs = bzalloc(sizeof(struct audio_resampler));
 	int errcode;
 
-	memset(rs, 0, sizeof(struct audio_resampler));
 	rs->opened        = false;
 	rs->input_freq    = src->samples_per_sec;
 	rs->input_layout  = convert_speaker_layout(src->speakers);
diff --git a/libobs/media-io/video-io.c b/libobs/media-io/video-io.c
index fa4583b0fea0bc999f32b663867ea752ea4bab23..eaf07a2a0554086828dcbde47b75bf8f2fe130eb 100644
--- a/libobs/media-io/video-io.c
+++ b/libobs/media-io/video-io.c
@@ -120,8 +120,7 @@ int video_output_open(video_t *video, struct video_output_info *info)
 	if (!valid_video_params(info))
 		return VIDEO_OUTPUT_INVALIDPARAM;
 
-	out = bmalloc(sizeof(struct video_output));
-	memset(out, 0, sizeof(struct video_output));
+	out = bzalloc(sizeof(struct video_output));
 
 	memcpy(&out->info, info, sizeof(struct video_output_info));
 	out->frame_time = (uint64_t)(1000000000.0 * (double)info->fps_den /
diff --git a/libobs/obs-data.c b/libobs/obs-data.c
index d906ca9a19b713f62f7d2e05638a1f1b6d35709d..386bc0534f089b4acdf30dce58b22069ef400ffb 100644
--- a/libobs/obs-data.c
+++ b/libobs/obs-data.c
@@ -118,8 +118,7 @@ static struct obs_data_item *obs_data_item_create(const char *name,
 	name_size = get_name_align_size(name);
 	total_size = name_size + sizeof(struct obs_data_item) + size;
 
-	item = bmalloc(total_size);
-	memset(item, 0, total_size);
+	item = bzalloc(total_size);
 
 	item->capacity = total_size;
 	item->type     = type;
@@ -224,8 +223,7 @@ static inline void obs_data_item_setdata(
 
 obs_data_t obs_data_create()
 {
-	struct obs_data *data = bmalloc(sizeof(struct obs_data));
-	memset(data, 0, sizeof(struct obs_data));
+	struct obs_data *data = bzalloc(sizeof(struct obs_data));
 	data->ref = 1;
 
 	return data;
@@ -452,8 +450,7 @@ obs_data_array_t obs_data_getarray(obs_data_t data, const char *name)
 
 obs_data_array_t obs_data_array_create()
 {
-	struct obs_data_array *array = bmalloc(sizeof(struct obs_data_array));
-	memset(array, 0, sizeof(struct obs_data_array));
+	struct obs_data_array *array = bzalloc(sizeof(struct obs_data_array));
 	array->ref = 1;
 
 	return array;
diff --git a/libobs/obs-display.c b/libobs/obs-display.c
index f950f0a7ff65e31e677f9fa032d29e1d97572c83..ba96f84e84fbea99fc747fad68f68f6d674b1698 100644
--- a/libobs/obs-display.c
+++ b/libobs/obs-display.c
@@ -20,8 +20,7 @@
 
 obs_display_t obs_display_create(struct gs_init_data *graphics_data)
 {
-	struct obs_display *display = bmalloc(sizeof(struct obs_display));
-	memset(display, 0, sizeof(struct obs_display));
+	struct obs_display *display = bzalloc(sizeof(struct obs_display));
 
 	if (graphics_data) {
 		display->swap = gs_create_swapchain(graphics_data);
diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c
index 0783df9a8228da368959107c52b0046c3e58c724..79f5b5a99eb94d46cdbc43a5c45cdde9e2af8979 100644
--- a/libobs/obs-encoder.c
+++ b/libobs/obs-encoder.c
@@ -67,8 +67,7 @@ obs_encoder_t obs_encoder_create(const char *id, const char *name,
 	if (!ei)
 		return NULL;
 
-	encoder = bmalloc(sizeof(struct obs_encoder));
-	memset(encoder, 0, sizeof(struct obs_encoder));
+	encoder = bzalloc(sizeof(struct obs_encoder));
 	encoder->callbacks = *ei;
 
 	if (pthread_mutex_init(&encoder->data_callbacks_mutex, NULL) != 0) {
diff --git a/libobs/obs-properties.c b/libobs/obs-properties.c
index 94a1998b97107dbbbe2a7f0e1b9d5376fa2fa936..89fe037c4e338d92fc899f021a33b41571376ab2 100644
--- a/libobs/obs-properties.c
+++ b/libobs/obs-properties.c
@@ -53,8 +53,7 @@ struct obs_properties {
 obs_properties_t obs_properties_create()
 {
 	struct obs_properties *list;
-	list = bmalloc(sizeof(struct obs_properties));
-	memset(list, 0, sizeof(struct obs_properties));
+	list = bzalloc(sizeof(struct obs_properties));
 	return list;
 }
 
@@ -90,9 +89,7 @@ void obs_properties_destroy(obs_properties_t props)
 obs_category_t obs_properties_add_category(obs_properties_t props,
 		const char *name)
 {
-	struct obs_category *c = bmalloc(sizeof(struct obs_category));
-	memset(c, 0, sizeof(struct obs_category));
-
+	struct obs_category *c = bzalloc(sizeof(struct obs_category));
 	c->name = name;
 	c->next = props->first_category;
 	props->first_category = c;
@@ -137,9 +134,7 @@ static inline struct obs_property *new_prop(struct obs_category *cat,
 	size_t data_size = get_property_size(type);
 	struct obs_property *p;
 
-	p = bmalloc(sizeof(struct obs_property) + data_size);
-	memset(p, 0, sizeof(struct obs_property) + data_size);
-
+	p = bzalloc(sizeof(struct obs_property) + data_size);
 	p->type = type;
 	p->name = name;
 	p->desc = desc;
diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c
index 8dbacf3512856e9f4ef679818779ea22eac53185..7e28ea4cc85bdb6c854652e824e790e6e2353801 100644
--- a/libobs/obs-scene.c
+++ b/libobs/obs-scene.c
@@ -168,10 +168,9 @@ static const struct source_info scene_info =
 
 obs_scene_t obs_scene_create(const char *name)
 {
-	struct obs_source *source = bmalloc(sizeof(struct obs_source));
+	struct obs_source *source = bzalloc(sizeof(struct obs_source));
 	struct obs_scene  *scene;
 
-	memset(source, 0, sizeof(struct obs_source));
 	if (!obs_source_init_handlers(source)) {
 		bfree(source);
 		return NULL;
@@ -269,10 +268,9 @@ void obs_scene_enum_items(obs_scene_t scene,
 obs_sceneitem_t obs_scene_add(obs_scene_t scene, obs_source_t source)
 {
 	struct obs_scene_item *last;
-	struct obs_scene_item *item = bmalloc(sizeof(struct obs_scene_item));
+	struct obs_scene_item *item = bzalloc(sizeof(struct obs_scene_item));
 	struct calldata params = {0};
 
-	memset(item, 0, sizeof(struct obs_scene_item));
 	item->source  = source;
 	item->visible = true;
 	item->parent  = scene;
diff --git a/libobs/obs-source.c b/libobs/obs-source.c
index 816965c6532292a47284ee0cd7685f0a4079a03d..6488e14b06132e9ea0b7d0bf7de7436ba2a54235 100644
--- a/libobs/obs-source.c
+++ b/libobs/obs-source.c
@@ -154,8 +154,7 @@ obs_source_t obs_source_create(enum obs_source_type type, const char *id,
 		return NULL;
 	}
 
-	source = bmalloc(sizeof(struct obs_source));
-	memset(source, 0, sizeof(struct obs_source));
+	source = bzalloc(sizeof(struct obs_source));
 
 	if (!obs_source_init_handlers(source))
 		goto fail;
diff --git a/libobs/obs.c b/libobs/obs.c
index e0fc0a07200dbe8ba4f28f34f8ea74ee5cef6c70..952030ade2faa1823e642ca98b50c0f409aa84b7 100644
--- a/libobs/obs.c
+++ b/libobs/obs.c
@@ -298,8 +298,7 @@ static inline bool obs_init_handlers(void)
 
 static bool obs_init(void)
 {
-	obs = bmalloc(sizeof(struct obs_core));
-	memset(obs, 0, sizeof(struct obs_core));
+	obs = bzalloc(sizeof(struct obs_core));
 
 	obs_init_data();
 	return obs_init_handlers();
diff --git a/libobs/obs.h b/libobs/obs.h
index 8395a02871dc28ae99d609a86172854f2e7c8648..93f1f6f0b906ee022901588420c4eac5024282e2 100644
--- a/libobs/obs.h
+++ b/libobs/obs.h
@@ -606,8 +606,7 @@ static inline struct source_frame *source_frame_create(
 {
 	struct source_frame *frame;
 
-	frame = (struct source_frame*)bmalloc(sizeof(struct source_frame));
-	memset(frame, 0, sizeof(struct source_frame));
+	frame = (struct source_frame*)bzalloc(sizeof(struct source_frame));
 	source_frame_init(frame, format, width, height);
 	return frame;
 }
diff --git a/libobs/util/bmem.h b/libobs/util/bmem.h
index ebb10d680cf08106241255e82694b137d38a1748..2ba4233ddd07f862fa09c3d8d1e792bd3ee96554 100644
--- a/libobs/util/bmem.h
+++ b/libobs/util/bmem.h
@@ -43,6 +43,14 @@ EXPORT uint64_t bnum_allocs(void);
 
 EXPORT void *bmemdup(const void *ptr, size_t size);
 
+static inline void *bzalloc(size_t size)
+{
+	void *mem = bmalloc(size);
+	if (mem)
+		memset(mem, 0, size);
+	return mem;
+}
+
 static inline char *bstrdup_n(const char *str, size_t n)
 {
 	char *dup;
diff --git a/libobs/util/config-file.c b/libobs/util/config-file.c
index ad616fad92a94cd3f5fceec33a1deb2c982c5733..923b9a0930765c2f554a7b37fea8a7df9237c83f 100644
--- a/libobs/util/config-file.c
+++ b/libobs/util/config-file.c
@@ -68,9 +68,7 @@ config_t config_create(const char *file)
 		return NULL;
 	fclose(f);
 
-	config = bmalloc(sizeof(struct config_data));
-	memset(config, 0, sizeof(struct config_data));
-
+	config = bzalloc(sizeof(struct config_data));
 	return config;
 }
 
@@ -235,8 +233,7 @@ int config_open(config_t *config, const char *file,
 	if (!config)
 		return CONFIG_ERROR;
 
-	*config = bmalloc(sizeof(struct config_data));
-	memset(*config, 0, sizeof(struct config_data));
+	*config = bzalloc(sizeof(struct config_data));
 	(*config)->file = bstrdup(file);
 
 	errorcode = config_parse(&(*config)->sections, file, always_open);
diff --git a/libobs/util/text-lookup.c b/libobs/util/text-lookup.c
index 1ed09fec14878d8ee911cefe199979bf6c6ee0bb..c14cec0470563ca32cd4cc15bd8e56c59280cbdd 100644
--- a/libobs/util/text-lookup.c
+++ b/libobs/util/text-lookup.c
@@ -102,21 +102,18 @@ struct text_lookup {
 static void lookup_createsubnode(const char *lookup_val,
 		struct text_leaf *leaf, struct text_node *node)
 {
-	struct text_node *new = bmalloc(sizeof(struct text_node));
-	memset(new, 0, sizeof(struct text_node));
-
+	struct text_node *new = bzalloc(sizeof(struct text_node));
 	new->leaf = leaf;
+	new->next = node->first_subnode;
 	dstr_copy(&new->str, lookup_val);
 
-	new->next = node->first_subnode;
 	node->first_subnode = new;
 }
 
 static void lookup_splitnode(const char *lookup_val, size_t len,
 		struct text_leaf *leaf, struct text_node *node)
 {
-	struct text_node *split = bmalloc(sizeof(struct text_node));
-	memset(split, 0, sizeof(struct text_node));
+	struct text_node *split = bzalloc(sizeof(struct text_node));
 
 	dstr_copy(&split->str, node->str.array+len);
 	split->leaf = node->leaf;
@@ -360,8 +357,7 @@ static inline bool lookup_getstring(const char *lookup_val,
 
 lookup_t text_lookup_create(const char *path)
 {
-	struct text_lookup *lookup = bmalloc(sizeof(struct text_lookup));
-	memset(lookup, 0, sizeof(struct text_lookup));
+	struct text_lookup *lookup = bzalloc(sizeof(struct text_lookup));
 
 	if (!text_lookup_add(lookup, path)) {
 		bfree(lookup);
@@ -388,10 +384,8 @@ bool text_lookup_add(lookup_t lookup, const char *path)
 	if (!file_str.array)
 		return false;
 
-	if (!lookup->top) {
-		lookup->top = bmalloc(sizeof(struct text_node));
-		memset(lookup->top, 0, sizeof(struct text_node));
-	}
+	if (!lookup->top)
+		lookup->top = bzalloc(sizeof(struct text_node));
 
 	dstr_replace(&file_str, "\r", " ");
 	lookup_addfiledata(lookup, file_str.array);
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
index fda80ac2705a57518a20fb57eb63e43a5480bc0a..0139b1c28d7dd47a6031f567a9fdb9ead4b6ff21 100644
--- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
@@ -330,9 +330,7 @@ void test_callback(void *param, int bla, const char *format, va_list args)
 struct ffmpeg_output *ffmpeg_output_create(const char *settings,
 		obs_output_t output)
 {
-	struct ffmpeg_output *data = bmalloc(sizeof(struct ffmpeg_output));
-	memset(data, 0, sizeof(struct ffmpeg_output));
-
+	struct ffmpeg_output *data = bzalloc(sizeof(struct ffmpeg_output));
 	data->output = output;
 
 	av_log_set_callback(test_callback);
diff --git a/test/test-input/test-desktop.m b/test/test-input/test-desktop.m
index 4aadecbd8ca852de92e2c119ca00a48c95bc2b24..f68a35e2faa535a91cab70b4ce2619e528763a24 100644
--- a/test/test-input/test-desktop.m
+++ b/test/test-input/test-desktop.m
@@ -23,11 +23,9 @@ static pthread_mutex_t c_mutex;
 struct desktop_tex *osx_desktop_test_create(const char *settings,
 		obs_source_t source)
 {
-	struct desktop_tex *rt = bmalloc(sizeof(struct desktop_tex));
+	struct desktop_tex *rt = bzalloc(sizeof(struct desktop_tex));
 	char *effect_file;
 
-	memset(rt, 0, sizeof(struct desktop_tex));
-
 	gs_entercontext(obs_graphics());
 
 	struct gs_sampler_info info = {
diff --git a/test/test-input/test-filter.c b/test/test-input/test-filter.c
index 1c6a584a10095737bafeab047738ffb63e312192..8be9990660536f57a780d120f1306442c844c3f0 100644
--- a/test/test-input/test-filter.c
+++ b/test/test-input/test-filter.c
@@ -7,9 +7,8 @@ const char *test_getname(const char *locale)
 
 struct test_filter *test_create(const char *settings, obs_source_t source)
 {
-	struct test_filter *tf = bmalloc(sizeof(struct test_filter));
+	struct test_filter *tf = bzalloc(sizeof(struct test_filter));
 	char *effect_file;
-	memset(tf, 0, sizeof(struct test_filter));
 
 	gs_entercontext(obs_graphics());
 
diff --git a/test/test-input/test-random.c b/test/test-input/test-random.c
index 41a70fce5c22f5c2ae87003f83bba7b0e9493479..3fe04288eca3013aa4a2f616f8eaa784c98f6aa1 100644
--- a/test/test-input/test-random.c
+++ b/test/test-input/test-random.c
@@ -8,12 +8,10 @@ const char *random_getname(const char *locale)
 
 struct random_tex *random_create(const char *settings, obs_source_t source)
 {
-	struct random_tex *rt = bmalloc(sizeof(struct random_tex));
+	struct random_tex *rt = bzalloc(sizeof(struct random_tex));
 	uint32_t *pixels = bmalloc(20*20*4);
 	size_t x, y;
 
-	memset(rt, 0, sizeof(struct random_tex));
-
 	for (y = 0; y < 20; y++) {
 		for (x = 0; x < 20; x++) {
 			uint32_t pixel = 0xFF000000;
diff --git a/test/test-input/test-sinewave.c b/test/test-input/test-sinewave.c
index 143a08f2031828b9c1d077aaffe7bd374b302c5e..3d9b10e28c8272e31ac88c79a6a6bdbf02cb3be9 100644
--- a/test/test-input/test-sinewave.c
+++ b/test/test-input/test-sinewave.c
@@ -52,8 +52,7 @@ const char *sinewave_getname(const char *locale)
 
 struct sinewave_data *sinewave_create(const char *settings, obs_source_t source)
 {
-	struct sinewave_data *swd = bmalloc(sizeof(struct sinewave_data));
-	memset(swd, 0, sizeof(struct sinewave_data));
+	struct sinewave_data *swd = bzalloc(sizeof(struct sinewave_data));
 	swd->source = source;
 
 	if (event_init(&swd->event, EVENT_TYPE_MANUAL) != 0)