diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index 86d020c44c8343f2ecaa071382a6573b0f0c0668..c9ad03e939da168bab92f0364e1e2ca052dd4f71 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -1,7 +1,7 @@
 #include "field_descriptor.hpp"
 
 
-int field_descriptor::initialize(
+field_descriptor::field_descriptor(
         int ndims,
         int *n,
         MPI_Datatype element_type)
@@ -33,16 +33,14 @@ int field_descriptor::initialize(
             this->mpi_dtype,
             &this->mpi_array_dtype);
     MPI_Type_commit(&this->mpi_array_dtype);
-    return EXIT_SUCCESS;
 }
 
-int field_descriptor::finalize()
+field_descriptor::~field_descriptor()
 {
     free((void*)this->sizes);
     free((void*)this->subsizes);
     free((void*)this->starts);
     MPI_Type_free(&this->mpi_array_dtype);
-    return EXIT_SUCCESS;
 }
 
 int field_descriptor::read(
diff --git a/src/field_descriptor.hpp b/src/field_descriptor.hpp
index fcad79a8a2b5fa7f135693778e119ce38029c221..ea0398e5fe2f05172a814158dbbcb9a8ed2a1859 100644
--- a/src/field_descriptor.hpp
+++ b/src/field_descriptor.hpp
@@ -20,13 +20,11 @@ class field_descriptor
         int local_size, full_size;
         MPI_Datatype mpi_array_dtype, mpi_dtype;
 
-        field_descriptor(){}
-        ~field_descriptor(){}
-        int initialize(
+        field_descriptor(
                 int ndims,
                 int *n,
                 MPI_Datatype element_type);
-        int finalize();
+        ~field_descriptor();
         int read(
                 const char *fname,
                 void *buffer);
diff --git a/src/transp.cpp b/src/transp.cpp
index e034bd0ee927562cda2af588de47cf37799467d1..3f6c294e6947deb6499ddba8af4aaa79b1f1ce8b 100644
--- a/src/transp.cpp
+++ b/src/transp.cpp
@@ -9,7 +9,7 @@ int main(int argc, char *argv[])
     MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
 
     int n[3];
-    field_descriptor f0, f1;
+    field_descriptor *f0, *f1;
 
     switch(argc)
     {
@@ -19,10 +19,10 @@ int main(int argc, char *argv[])
             // dimensions
             n[0] = atoi(argv[1]);
             n[1] = atoi(argv[2]);
-            f0.initialize(2, n, MPI_FLOAT);
+            f0 = new field_descriptor(2, n, MPI_FLOAT);
             n[0] = atoi(argv[2]);
             n[1] = atoi(argv[1]);
-            f1.initialize(2, n, MPI_FLOAT);
+            f1 = new field_descriptor(2, n, MPI_FLOAT);
             break;
         case 4:
             if (myrank == 0)
@@ -31,29 +31,30 @@ int main(int argc, char *argv[])
             n[0] = atoi(argv[1]);
             n[1] = atoi(argv[2]);
             n[2] = atoi(argv[3]);
-            f0.initialize(3, n, MPI_FLOAT);
+            f0 = new field_descriptor(3, n, MPI_FLOAT);
             n[0] = atoi(argv[3]);
             n[1] = atoi(argv[2]);
             n[2] = atoi(argv[1]);
-            f1.initialize(3, n, MPI_FLOAT);
+            f1 = new field_descriptor(3, n, MPI_FLOAT);
             break;
         default:
             printf("you messed up the parameters, I'm not doing anything.\n");
-            f0.finalize();
-            f1.finalize();
             MPI_Finalize();
+            return EXIT_SUCCESS;
             break;
     }
 
     float *a0, *a1;
-    a0 = (float*)malloc(f0.local_size*sizeof(float));
-    a1 = (float*)malloc(f1.local_size*sizeof(float));
-    f0.read("data0", (void*)a0);
-    f0.transpose(a0, a1);
-    f1.write("data1", (void*)a1);
+    a0 = (float*)malloc(f0->local_size*sizeof(float));
+    a1 = (float*)malloc(f1->local_size*sizeof(float));
+    f0->read("data0", (void*)a0);
+    f0->transpose(a0, a1);
+    f1->write("data1", (void*)a1);
     free(a0);
     free(a1);
 
+    delete f0;
+    delete f1;
     MPI_Finalize();
     return EXIT_SUCCESS;
 }