diff --git a/bob/io/base/cpp/TensorFile.cpp b/bob/io/base/cpp/TensorFile.cpp
index 66b72160ed861cf97126c4ff4bf4b26fc1f18046..8f9ff3455c245613c6b0b2c31e327856493089ed 100644
--- a/bob/io/base/cpp/TensorFile.cpp
+++ b/bob/io/base/cpp/TensorFile.cpp
@@ -12,6 +12,16 @@
 #include <bob.io.base/reorder.h>
 #include <bob.io.base/array_type.h>
 
+// see: http://stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used
+template< typename T >
+struct array_deleter
+{
+  void operator ()( T const * p)
+  {
+    delete[] p;
+  }
+};
+
 bob::io::base::TensorFile::TensorFile(const std::string& filename,
     bob::io::base::TensorFile::openmode flag):
   m_header_init(false),
@@ -25,7 +35,7 @@ bob::io::base::TensorFile::TensorFile(const std::string& filename,
     if(m_stream)
     {
       m_header.read(m_stream);
-      m_buffer.reset(new char[m_header.m_type.buffer_size()]);
+      m_buffer.reset(new char[m_header.m_type.buffer_size()], array_deleter<char>());
       m_header_init = true;
       m_n_arrays_written = m_header.m_n_samples;
 
@@ -40,7 +50,7 @@ bob::io::base::TensorFile::TensorFile(const std::string& filename,
       m_stream.open(filename.c_str(), std::ios::out | std::ios::in |
           std::ios::binary);
       m_header.read(m_stream);
-      m_buffer.reset(new char[m_header.m_type.buffer_size()]);
+      m_buffer.reset(new char[m_header.m_type.buffer_size()], array_deleter<char>());
       m_header_init = true;
       m_n_arrays_written = m_header.m_n_samples;
       m_stream.seekp(0, std::ios::end);
@@ -53,7 +63,7 @@ bob::io::base::TensorFile::TensorFile(const std::string& filename,
     m_stream.open(filename.c_str(), std::ios::in | std::ios::binary);
     if(m_stream) {
       m_header.read(m_stream);
-      m_buffer.reset(new char[m_header.m_type.buffer_size()]);
+      m_buffer.reset(new char[m_header.m_type.buffer_size()], array_deleter<char>());
       m_header_init = true;
       m_n_arrays_written = m_header.m_n_samples;
 
@@ -95,7 +105,7 @@ void bob::io::base::TensorFile::initHeader(const bob::io::base::array::typeinfo&
   m_header.write(m_stream);
 
   // Temporary buffer to help with data transposition...
-  m_buffer.reset(new char[m_header.m_type.buffer_size()]);
+  m_buffer.reset(new char[m_header.m_type.buffer_size()], array_deleter<char>());
 
   m_header_init = true;
 }
diff --git a/bob/io/base/file.cpp b/bob/io/base/file.cpp
index 2adb35620b744c0b1c23031cf26b33fa78f76f7f..1b2d4dccf16bc7aab6a4bb1ed5710ba824b7987b 100644
--- a/bob/io/base/file.cpp
+++ b/bob/io/base/file.cpp
@@ -447,6 +447,8 @@ static PyObject* PyBobIoFile_Write(PyBobIoFileObject* self, PyObject *args, PyOb
   PyBlitzArrayObject* bz = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &PyBlitzArray_Converter, &bz)) return 0;
 
+  auto bz_ = make_safe(bz);
+
   try {
     bobskin skin(bz);
     self->f->write(skin);
@@ -498,6 +500,7 @@ static PyObject* PyBobIoFile_Append(PyBobIoFileObject* self, PyObject *args, PyO
 
   PyBlitzArrayObject* bz = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &PyBlitzArray_Converter, &bz)) return 0;
+  auto bz_ = make_safe(bz);
   Py_ssize_t pos = -1;
 
   try {