diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp
index bc653d8ec..fcd27a3b1 100644
--- a/xs/src/TriangleMesh.cpp
+++ b/xs/src/TriangleMesh.cpp
@@ -161,8 +161,8 @@ void TriangleMesh::rotate(double angle, Point* center)
     this->translate(+center->x, +center->y, 0);
 }
 
-std::vector<Polygons>*
-TriangleMesh::slice(const std::vector<double> &z)
+void
+TriangleMesh::slice(const std::vector<double> &z, std::vector<Polygons> &layers)
 {
     /*
        This method gets called with a list of Z coordinates and outputs
@@ -368,7 +368,7 @@ TriangleMesh::slice(const std::vector<double> &z)
     }
     
     // build loops
-    std::vector<Polygons>* layers = new std::vector<Polygons>(z.size());
+    layers.resize(z.size());
     for (std::vector<IntersectionLines>::iterator it = lines.begin(); it != lines.end(); ++it) {
         int layer_idx = it - lines.begin();
         #ifdef SLIC3R_DEBUG
@@ -461,7 +461,7 @@ TriangleMesh::slice(const std::vector<double> &z)
                         for (IntersectionLinePtrs::iterator lineptr = loop.begin(); lineptr != loop.end(); ++lineptr) {
                             p.points.push_back((*lineptr)->a);
                         }
-                        (*layers)[layer_idx].push_back(p);
+                        layers[layer_idx].push_back(p);
                         
                         #ifdef SLIC3R_DEBUG
                         printf("  Discovered %s polygon of %d points\n", (p.is_counter_clockwise() ? "ccw" : "cw"), (int)p.points.size());
@@ -487,8 +487,6 @@ TriangleMesh::slice(const std::vector<double> &z)
             }
         }
     }
-    
-    return layers;
 }
 
 TriangleMeshPtrs
diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp
index d341fa098..cd0b5377d 100644
--- a/xs/src/TriangleMesh.hpp
+++ b/xs/src/TriangleMesh.hpp
@@ -28,7 +28,7 @@ class TriangleMesh
     void translate(float x, float y, float z);
     void align_to_origin();
     void rotate(double angle, Point* center);
-    std::vector<Polygons>* slice(const std::vector<double> &z);
+    void slice(const std::vector<double> &z, std::vector<Polygons> &layers);
     TriangleMeshPtrs split() const;
     void merge(const TriangleMesh* mesh);
     stl_file stl;
diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp
index 664c03713..8d6c42375 100644
--- a/xs/xsp/TriangleMesh.xsp
+++ b/xs/xsp/TriangleMesh.xsp
@@ -129,20 +129,20 @@ SV*
 TriangleMesh::slice(z)
     std::vector<double>* z
     CODE:
-        std::vector<Polygons>* layers = THIS->slice(*z);
+        std::vector<Polygons> layers;
+        THIS->slice(*z, layers);
         
         AV* layers_av = newAV();
-        av_extend(layers_av, layers->size()-1);
-        for (unsigned int i = 0; i < layers->size(); i++) {
+        av_extend(layers_av, layers.size()-1);
+        for (unsigned int i = 0; i < layers.size(); i++) {
             AV* polygons_av = newAV();
-            av_extend(polygons_av, (*layers)[i].size()-1);
+            av_extend(polygons_av, layers[i].size()-1);
             unsigned int j = 0;
-            for (Polygons::iterator it = (*layers)[i].begin(); it != (*layers)[i].end(); ++it) {
+            for (Polygons::iterator it = layers[i].begin(); it != layers[i].end(); ++it) {
                 av_store(polygons_av, j++, (*it).to_SV_clone_ref());
             }
             av_store(layers_av, i, newRV_noinc((SV*)polygons_av));
         }
-        delete layers;
         RETVAL = (SV*)newRV_noinc((SV*)layers_av);
     OUTPUT:
         RETVAL