diff --git a/jinja_filters.py b/jinja_filters.py
index 3ec11f235fd092bf337f7dc2ed24c4ab41ff0c96..4e518b7a0b9193c59a2db2e7f2083c7bc76c4288 100644
--- a/jinja_filters.py
+++ b/jinja_filters.py
@@ -24,6 +24,15 @@ else
 }}
 """
 
+temporary_constructor = """
+~{class_name}() {{  {contents} }}
+"""
+
+delete_loop = """
+    for(auto p: cache_{original_field_name}_) {{
+        delete p;
+    }}
+"""
 
 def make_field_type(dtype, f_size, is_gpu):
     if is_gpu:
@@ -318,6 +327,16 @@ def generate_members(ctx, kernel_info, parameters_to_ignore=(), only_fields=Fals
     return "\n".join(result)
 
 
+def generate_destructor(kernel_info, class_name):
+    if not kernel_info.temporary_fields:
+        return ""
+    else:
+        contents = ""
+        for field_name in kernel_info.temporary_fields:
+            contents += delete_loop.format(original_field_name=field_name[:-len('_tmp')])
+        return temporary_constructor.format(contents=contents, class_name=class_name)
+
+
 def add_pystencils_filters_to_jinja_env(jinja_env):
     jinja_env.filters['generate_definition'] = generate_definition
     jinja_env.filters['generate_declaration'] = generate_declaration
@@ -328,3 +347,4 @@ def add_pystencils_filters_to_jinja_env(jinja_env):
     jinja_env.filters['generate_block_data_to_field_extraction'] = generate_block_data_to_field_extraction
     jinja_env.filters['generate_swaps'] = generate_swaps
     jinja_env.filters['generate_refs_for_kernel_parameters'] = generate_refs_for_kernel_parameters
+    jinja_env.filters['generate_destructor'] = generate_destructor
diff --git a/templates/Sweep.tmpl.h b/templates/Sweep.tmpl.h
index 8f976215a36075fd9e16bb54019f6a0fc642a8cf..bda958e8fff1fcebcd4d723bee17ecfb727c7f3d 100644
--- a/templates/Sweep.tmpl.h
+++ b/templates/Sweep.tmpl.h
@@ -54,6 +54,8 @@ public:
         : {{ kernel|generate_constructor_initializer_list }}, stream_(stream)
     {};
 
+    {{ kernel| generate_destructor(class_name) |indent(4) }}
+
     void operator() ( IBlock * block );
 private:
     {{kernel|generate_members|indent(4)}}
diff --git a/templates/SweepInnerOuter.tmpl.h b/templates/SweepInnerOuter.tmpl.h
index 2bdde0a994961ab5ebf14417a821ba113a8c0078..a9377dd685bb6c1b4fb9e565f8328c70b84419a3 100644
--- a/templates/SweepInnerOuter.tmpl.h
+++ b/templates/SweepInnerOuter.tmpl.h
@@ -55,6 +55,9 @@ public:
         : {{ kernel|generate_constructor_initializer_list }}
     {};
 
+    {{ kernel| generate_destructor(class_name) |indent(4) }}
+
+
     void operator() ( IBlock * block{%if target is equalto 'gpu'%} , cudaStream_t stream = 0{% endif %} );
 
     void inner( IBlock * block{%if target is equalto 'gpu'%} , cudaStream_t stream = 0{% endif %} );