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 {