From c0ffce092fb97e2996678d2fd8e45d2b8f560126 Mon Sep 17 00:00:00 2001 From: Binh-Minh Ribler Date: Sun, 10 Dec 2006 20:23:04 -0500 Subject: [svn-r13038] Purpose: Fixed user reported bug Description: In Attribute::read, H5Aread malloc's memory for the read data buffer, so Attribute::read shouldn't allocate the buffer, but needs to deallocate with HDfree. Fixed a typo in H5StrType.cpp, should pass PredType::C_S1 to "copy" instead of H5T_C_S1. Platforms tested: AIX 5.1 (copper) Linux 2.6 (kagiso) SunOS 5.8 64-bit (sol) --- c++/src/H5Attribute.cpp | 16 +++++++++++----- c++/src/H5StrType.cpp | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index ec12d6b..438f6e7 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -30,6 +30,7 @@ #include "H5CommonFG.h" #include "H5DataType.h" #include "H5DataSpace.h" +#include "H5private.h" #ifndef H5_NO_NAMESPACE namespace H5 { @@ -128,18 +129,23 @@ void Attribute::read( const DataType& mem_type, void *buf ) const ///\param strg - IN: Buffer for read string ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - Apr, 2003 +// Modification +// 2006/12/9 - H5Aread allocates memory for character string +// buffer with malloc, therefore, no allocation here, +// but HDfree is needed. - BMR //-------------------------------------------------------------------------- void Attribute::read( const DataType& mem_type, H5std_string& strg ) const { - size_t size = mem_type.getSize(); - char* strg_C = new char[size+1]; // temporary C-string for C API - herr_t ret_value = H5Aread( id, mem_type.getId(), &strg_C ); + char* strg_C; // temporary C-string for C API + + // call C API to get the attribute string of chars + herr_t ret_value = H5Aread( id, mem_type.getId(), &strg_C); if( ret_value < 0 ) { throw AttributeIException("Attribute::read", "H5Aread failed"); } - strg = strg_C; - delete []strg_C; + strg = strg_C; // get 'string' from the C char* + HDfree(strg_C); } //-------------------------------------------------------------------------- diff --git a/c++/src/H5StrType.cpp b/c++/src/H5StrType.cpp index 849f345..bbf2bf5 100644 --- a/c++/src/H5StrType.cpp +++ b/c++/src/H5StrType.cpp @@ -102,7 +102,7 @@ StrType::StrType( const int dummy, const size_t& size ) : AtomType() { // use DataType::copy to make a copy of the string predefined type // then set its length - copy(H5T_C_S1); + copy(PredType::C_S1); setSize(size); } -- cgit v0.12