summaryrefslogtreecommitdiffstats
path: root/c++/src/H5DataSet.cpp
diff options
context:
space:
mode:
authorBinh-Minh Ribler <bmribler@hdfgroup.org>2012-03-23 05:43:59 (GMT)
committerBinh-Minh Ribler <bmribler@hdfgroup.org>2012-03-23 05:43:59 (GMT)
commit2ae01a1bf49129a3d292257fc0fad929bf7e1301 (patch)
tree21839183672ea46951808b24c7302b9fad17a81f /c++/src/H5DataSet.cpp
parentb462f48e9b308886b6ed455a4aae7cbf0b8a2749 (diff)
downloadhdf5-2ae01a1bf49129a3d292257fc0fad929bf7e1301.zip
hdf5-2ae01a1bf49129a3d292257fc0fad929bf7e1301.tar.gz
hdf5-2ae01a1bf49129a3d292257fc0fad929bf7e1301.tar.bz2
[svn-r22131] Purpose: Fixed bug 4279
Description: Closed various HDF5 objects in DataSet::getInMemDataSize and Attribute::getInMemDataSize to remove some memory leaks. Platforms tested: Linux/32 2.6 (jam) Linux/64 2.6 (amani) SunOS 5.10 (linew)
Diffstat (limited to 'c++/src/H5DataSet.cpp')
-rw-r--r--c++/src/H5DataSet.cpp26
1 files changed, 22 insertions, 4 deletions
diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp
index 0639dd4..f7aaa72 100644
--- a/c++/src/H5DataSet.cpp
+++ b/c++/src/H5DataSet.cpp
@@ -229,7 +229,7 @@ hsize_t DataSet::getStorageSize() const
//--------------------------------------------------------------------------
size_t DataSet::getInMemDataSize() const
{
- char *func = "DataSet::getInMemDataSize";
+ const char *func = "DataSet::getInMemDataSize";
// Get the data type of this dataset
hid_t mem_type_id = H5Dget_type(id);
@@ -238,7 +238,8 @@ size_t DataSet::getInMemDataSize() const
throw DataSetIException(func, "H5Dget_type failed");
}
- // Get the data type's size
+ // Get the data type's size by first getting its native type then getting
+ // the native type's size.
hid_t native_type = H5Tget_native_type(mem_type_id, H5T_DIR_DEFAULT);
if (native_type < 0)
{
@@ -250,8 +251,19 @@ size_t DataSet::getInMemDataSize() const
throw DataSetIException(func, "H5Tget_size failed");
}
- // Get number of elements of the dataset
- hid_t space_id = H5Dget_space(id); // first get its data space
+ // Close the native type and the datatype of this dataset.
+ if (H5Tclose(native_type) < 0)
+ {
+ throw DataSetIException(func, "H5Tclose(native_type) failed");
+ }
+ if (H5Tclose(mem_type_id) < 0)
+ {
+ throw DataSetIException(func, "H5Tclose(mem_type_id) failed");
+ }
+
+ // Get number of elements of the dataset by first getting its dataspace,
+ // then getting the number of elements in the dataspace
+ hid_t space_id = H5Dget_space(id);
if (space_id < 0)
{
throw DataSetIException(func, "H5Dget_space failed");
@@ -262,6 +274,12 @@ size_t DataSet::getInMemDataSize() const
throw DataSetIException(func, "H5Sget_simple_extent_npoints failed");
}
+ // Close the dataspace
+ if (H5Sclose(space_id) < 0)
+ {
+ throw DataSetIException(func, "H5Sclose failed");
+ }
+
// Calculate and return the size of the data
size_t data_size = type_size * num_elements;
return(data_size);