diff --git a/main.cpp b/main.cpp
index 303cf696ab24ff5283ce5c85d6ea36fb4a6c93a9..e29e7d3b0d233fe2bae616ee5c8737df7b9ab8c5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -26,9 +26,9 @@ int main(void)
     float* farray;
     size_t farray_size = 0;
     memproc::realloc<MemType::CPU>((void *&)(farray), farray_size, mesh1.GetCellsNum() * sizeof(float));
-    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, (*cells_temp), farray_size);
+    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, *cells_temp.get(), mesh1.GetCellsNum() * sizeof(float));
     farray[0] = 1.0f; farray[1] = 2.0f; farray[2] = 3.0f;
-    memproc::memcopy<MemType::GPU, MemType::CPU>((*cells_temp), farray, farray_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(*cells_temp.get(), farray, mesh1.GetCellsNum() * sizeof(float));
 #else
     (*cells_temp)[0] = 1.0f; (*cells_temp)[1] = 2.0f; (*cells_temp)[2] = 3.0f;
 #endif 
@@ -40,9 +40,9 @@ int main(void)
     // one can modify nodes data 
 #ifdef INCLUDE_CUDA
     memproc::realloc<MemType::CPU>((void *&)(farray), farray_size, mesh1.GetNodesNum() * sizeof(float));
-    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, (*nodes_k), farray_size);
+    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, *nodes_k.get(), mesh1.GetNodesNum() * sizeof(float));
     farray[0] = -5.0f; farray[mesh1.GetNodesNum() - 1] = -3.0f;
-    memproc::memcopy<MemType::GPU, MemType::CPU>((*nodes_k), farray, farray_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(*nodes_k.get(), farray, mesh1.GetNodesNum() * sizeof(float));
 #else
     (*nodes_k)[0] = -5.0f; (*nodes_k)[mesh1.GetNodesNum() - 1] = -3.0f;
 #endif 
@@ -67,19 +67,19 @@ int main(void)
 
 #ifdef INCLUDE_CUDA
     memproc::realloc<MemType::CPU>((void *&)(farray), farray_size, mesh1.GetCellsNum() * sizeof(float));
-    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, (*another_cells_temp), farray_size);
+    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, *another_cells_temp.get(), mesh1.GetCellsNum() * sizeof(float));
     farray[0] = -5.0f;
-    memproc::memcopy<MemType::GPU, MemType::CPU>((*another_cells_temp), farray, farray_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(*another_cells_temp.get(), farray, mesh1.GetCellsNum() * sizeof(float));
 
     memproc::realloc<MemType::CPU>((void *&)(farray), farray_size, mesh1.GetNodesNum() * sizeof(float));
-    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, (*another_nodes_k), farray_size);
+    memproc::memcopy<MemType::CPU, MemType::GPU>(farray, *another_nodes_k.get(), mesh1.GetNodesNum() * sizeof(float));
     farray[0] *= 2.0f;
-    memproc::memcopy<MemType::GPU, MemType::CPU>((*another_nodes_k), farray, farray_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(*another_nodes_k.get(), farray, mesh1.GetNodesNum() * sizeof(float));
 #else
     (*another_cells_temp)[0] = -5.0f;
     (*another_nodes_k)[0] *= 2.0f;
-    (*another_temp_ib) = -30.0f;
 #endif 
+    (*another_temp_ib) = -30.0f;
 
     // one can get total thickness
     std::cout << "current total cell thickness: " << mesh1.GetTotalThickness() << std::endl;
@@ -114,7 +114,7 @@ int main(void)
     size_t dev_segment_partition_size = 0;
 
     memproc::realloc<MemType::GPU>((void *&)(dev_segment_partition), dev_segment_partition_size, 2 * sizeof(double));
-    memproc::memcopy<MemType::GPU, MemType::CPU>(dev_segment_partition, dsegment_partition, dev_segment_partition_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(dev_segment_partition, dsegment_partition, 2 * sizeof(double));
 
     Mesh<double, MemType::GPU> mesh3(dev_segment_partition, 2, 5.0);
 #else
@@ -138,12 +138,12 @@ int main(void)
     size_t darray_size = 0;
 
     memproc::realloc<MemType::CPU>((void *&)(darray), darray_size, N * sizeof(double));
-    memproc::memcopy<MemType::CPU, MemType::GPU>(darray, *cells_thick, N);
+    memproc::memcopy<MemType::CPU, MemType::GPU>(darray, *cells_thick.get(), N * sizeof(double));
 
     for (int i = 0; i < N; ++i)
         darray[i] = -5.0 + i*1.0/N * (-5.0);
 
-    memproc::memcopy<MemType::GPU, MemType::CPU>(*cells_thick, darray, N);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(*cells_thick.get(), darray, N * sizeof(double));
 #else
     for (int i = 0; i < N; ++i)
         (*cells_thick)[i] = -5.0 + i*1.0/N * (-5.0);
@@ -156,7 +156,7 @@ int main(void)
     dsegment_partition[0] = 0.5; dsegment_partition[1] = 0.4;
 
     memproc::realloc<MemType::GPU>((void *&)(dev_segment_partition), dev_segment_partition_size, 2 * sizeof(double));
-    memproc::memcopy<MemType::GPU, MemType::CPU>(dev_segment_partition, dsegment_partition, dev_segment_partition_size);
+    memproc::memcopy<MemType::GPU, MemType::CPU>(dev_segment_partition, dsegment_partition, 2 * sizeof(double));
 
     Mesh<double, MemType::GPU> mesh4(dev_segment_partition, 2, 5.0);
 #else