From 5bc62b14e06a3fcfda4e3a19fba77589920eddee Mon Sep 17 00:00:00 2001
From: AlexeyAB <alexeyab84@gmail.com>
Date: Mon, 03 Jul 2017 11:12:52 +0000
Subject: [PATCH] Memory leak fixed

---
 src/network.c |   19 +++---
 src/image.c   |    6 +-
 src/layer.c   |  116 ++++++++++++++++++++++++++++----------
 3 files changed, 97 insertions(+), 44 deletions(-)

diff --git a/src/image.c b/src/image.c
index 6a16745..b063a68 100644
--- a/src/image.c
+++ b/src/image.c
@@ -543,7 +543,7 @@
 			//printf("\n cvCreateVideoWriter, DST output_video = %p  \n", output_video);
 		}
 
-		cvWriteFrame(output_video, disp);	// comment this line to improve FPS !!!
+		//cvWriteFrame(output_video, disp);	// comment this line to improve FPS !!!
 		printf("\n cvWriteFrame \n");
 	}
 
@@ -626,8 +626,8 @@
 	*in_img = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 3);
 	cvResize(src, *in_img, CV_INTER_LINEAR);
 	cvResize(src, new_img, CV_INTER_LINEAR);
-	src = new_img;
-	image im = ipl_to_image(src);
+	image im = ipl_to_image(new_img);
+	cvReleaseImage(&new_img);
 	rgbgr_image(im);
 	return im;
 }
diff --git a/src/layer.c b/src/layer.c
index 5fb5d24..b88c941 100644
--- a/src/layer.c
+++ b/src/layer.c
@@ -4,41 +4,93 @@
 
 void free_layer(layer l)
 {
-    if(l.type == DROPOUT){
-        if(l.rand)           free(l.rand);
+	if (l.type == DROPOUT) {
+		if (l.rand)           free(l.rand);
 #ifdef GPU
-        if(l.rand_gpu)             cuda_free(l.rand_gpu);
+		if (l.rand_gpu)             cuda_free(l.rand_gpu);
 #endif
-        return;
-    }
-    if(l.indexes)        free(l.indexes);
-    if(l.rand)           free(l.rand);
-    if(l.cost)           free(l.cost);
-    if(l.biases)         free(l.biases);
-    if(l.bias_updates)   free(l.bias_updates);
-    if(l.weights)        free(l.weights);
-    if(l.weight_updates) free(l.weight_updates);
-    if(l.col_image)      free(l.col_image);
-    if(l.input_layers)   free(l.input_layers);
-    if(l.input_sizes)    free(l.input_sizes);
-    if(l.delta)          free(l.delta);
-    if(l.output)         free(l.output);
-    if(l.squared)        free(l.squared);
-    if(l.norms)          free(l.norms);
+		return;
+	}
+	if (l.cweights)           free(l.cweights);
+	if (l.indexes)            free(l.indexes);
+	if (l.input_layers)       free(l.input_layers);
+	if (l.input_sizes)        free(l.input_sizes);
+	if (l.map)                free(l.map);
+	if (l.rand)               free(l.rand);
+	if (l.cost)               free(l.cost);
+	if (l.state)              free(l.state);
+	if (l.prev_state)         free(l.prev_state);
+	if (l.forgot_state)       free(l.forgot_state);
+	if (l.forgot_delta)       free(l.forgot_delta);
+	if (l.state_delta)        free(l.state_delta);
+	if (l.concat)             free(l.concat);
+	if (l.concat_delta)       free(l.concat_delta);
+	if (l.binary_weights)     free(l.binary_weights);
+	if (l.biases)             free(l.biases);
+	if (l.bias_updates)       free(l.bias_updates);
+	if (l.scales)             free(l.scales);
+	if (l.scale_updates)      free(l.scale_updates);
+	if (l.weights)            free(l.weights);
+	if (l.weight_updates)     free(l.weight_updates);
+	if (l.delta)              free(l.delta);
+	if (l.output)             free(l.output);
+	if (l.squared)            free(l.squared);
+	if (l.norms)              free(l.norms);
+	if (l.spatial_mean)       free(l.spatial_mean);
+	if (l.mean)               free(l.mean);
+	if (l.variance)           free(l.variance);
+	if (l.mean_delta)         free(l.mean_delta);
+	if (l.variance_delta)     free(l.variance_delta);
+	if (l.rolling_mean)       free(l.rolling_mean);
+	if (l.rolling_variance)   free(l.rolling_variance);
+	if (l.x)                  free(l.x);
+	if (l.x_norm)             free(l.x_norm);
+	if (l.m)                  free(l.m);
+	if (l.v)                  free(l.v);
+	if (l.z_cpu)              free(l.z_cpu);
+	if (l.r_cpu)              free(l.r_cpu);
+	if (l.h_cpu)              free(l.h_cpu);
+	if (l.binary_input)       free(l.binary_input);
 
 #ifdef GPU
-    if(l.indexes_gpu)          cuda_free((float *)l.indexes_gpu);
-    //if(l.weights_gpu)          cuda_free(l.weights_gpu);			// duplicated
-    //if(l.weight_updates_gpu)   cuda_free(l.weight_updates_gpu);	// duplicated
-    if(l.col_image_gpu)        cuda_free(l.col_image_gpu);
-    if(l.weights_gpu)          cuda_free(l.weights_gpu);
-    if(l.biases_gpu)           cuda_free(l.biases_gpu);
-    if(l.weight_updates_gpu)   cuda_free(l.weight_updates_gpu);
-    if(l.bias_updates_gpu)     cuda_free(l.bias_updates_gpu);
-    if(l.output_gpu)           cuda_free(l.output_gpu);
-    if(l.delta_gpu)            cuda_free(l.delta_gpu);
-    if(l.rand_gpu)             cuda_free(l.rand_gpu);
-    if(l.squared_gpu)          cuda_free(l.squared_gpu);
-    if(l.norms_gpu)            cuda_free(l.norms_gpu);
+	if (l.indexes_gpu)           cuda_free((float *)l.indexes_gpu);
+
+	if (l.z_gpu)                   cuda_free(l.z_gpu);
+	if (l.r_gpu)                   cuda_free(l.r_gpu);
+	if (l.h_gpu)                   cuda_free(l.h_gpu);
+	if (l.m_gpu)                   cuda_free(l.m_gpu);
+	if (l.v_gpu)                   cuda_free(l.v_gpu);
+	if (l.prev_state_gpu)          cuda_free(l.prev_state_gpu);
+	if (l.forgot_state_gpu)        cuda_free(l.forgot_state_gpu);
+	if (l.forgot_delta_gpu)        cuda_free(l.forgot_delta_gpu);
+	if (l.state_gpu)               cuda_free(l.state_gpu);
+	if (l.state_delta_gpu)         cuda_free(l.state_delta_gpu);
+	if (l.gate_gpu)                cuda_free(l.gate_gpu);
+	if (l.gate_delta_gpu)          cuda_free(l.gate_delta_gpu);
+	if (l.save_gpu)                cuda_free(l.save_gpu);
+	if (l.save_delta_gpu)          cuda_free(l.save_delta_gpu);
+	if (l.concat_gpu)              cuda_free(l.concat_gpu);
+	if (l.concat_delta_gpu)        cuda_free(l.concat_delta_gpu);
+	if (l.binary_input_gpu)        cuda_free(l.binary_input_gpu);
+	if (l.binary_weights_gpu)      cuda_free(l.binary_weights_gpu);
+	if (l.mean_gpu)                cuda_free(l.mean_gpu);
+	if (l.variance_gpu)            cuda_free(l.variance_gpu);
+	if (l.rolling_mean_gpu)        cuda_free(l.rolling_mean_gpu);
+	if (l.rolling_variance_gpu)    cuda_free(l.rolling_variance_gpu);
+	if (l.variance_delta_gpu)      cuda_free(l.variance_delta_gpu);
+	if (l.mean_delta_gpu)          cuda_free(l.mean_delta_gpu);
+	if (l.x_gpu)                   cuda_free(l.x_gpu);
+	if (l.x_norm_gpu)              cuda_free(l.x_norm_gpu);
+	if (l.weights_gpu)             cuda_free(l.weights_gpu);
+	if (l.weight_updates_gpu)      cuda_free(l.weight_updates_gpu);
+	if (l.biases_gpu)              cuda_free(l.biases_gpu);
+	if (l.bias_updates_gpu)        cuda_free(l.bias_updates_gpu);
+	if (l.scales_gpu)              cuda_free(l.scales_gpu);
+	if (l.scale_updates_gpu)       cuda_free(l.scale_updates_gpu);
+	if (l.output_gpu)              cuda_free(l.output_gpu);
+	if (l.delta_gpu)               cuda_free(l.delta_gpu);
+	if (l.rand_gpu)                cuda_free(l.rand_gpu);
+	if (l.squared_gpu)             cuda_free(l.squared_gpu);
+	if (l.norms_gpu)               cuda_free(l.norms_gpu);
 #endif
 }
diff --git a/src/network.c b/src/network.c
index 0914e37..0a49bf1 100644
--- a/src/network.c
+++ b/src/network.c
@@ -590,15 +590,16 @@
 
 void free_network(network net)
 {
-    int i;
-    for(i = 0; i < net.n; ++i){
-        free_layer(net.layers[i]);
-    }
-    free(net.layers);
+	int i;
+	for (i = 0; i < net.n; ++i) {
+		free_layer(net.layers[i]);
+	}
+	free(net.layers);
+	free(net.workspace);
 #ifdef GPU
-    if(*net.input_gpu) cuda_free(*net.input_gpu);
-    if(*net.truth_gpu) cuda_free(*net.truth_gpu);
-    if(net.input_gpu) free(net.input_gpu);
-    if(net.truth_gpu) free(net.truth_gpu);
+	if (*net.input_gpu) cuda_free(*net.input_gpu);
+	if (*net.truth_gpu) cuda_free(*net.truth_gpu);
+	if (net.input_gpu) free(net.input_gpu);
+	if (net.truth_gpu) free(net.truth_gpu);
 #endif
 }

--
Gitblit v1.10.0