diff --git a/src/resource_handle.c b/src/resource_handle.c
index 20ced5f8cff8888a2da4cf23dc9719e54b0173cf..eabb48065695a450969b61a0cb6563b34dfa750d 100644
--- a/src/resource_handle.c
+++ b/src/resource_handle.c
@@ -426,13 +426,18 @@ void reshDestroy(cdiResH resH)
 
   nspT = namespaceResHDecode ( resH );
 
+  listElem_t *r = resHList[nsp].resources + nspT.idx;
+
   xassert ( nspT.nsp == nsp
             && nspT.idx >= 0
             && nspT.idx < resHList[nsp].size
-            && resHList[nsp].resources[nspT.idx].res.v.ops);
+            && r->res.v.ops);
 
-  if (resHList[nsp].resources[nspT.idx].status & RESH_IN_USE_BIT)
-    reshRemove_(nsp, nspT.idx, __func__);
+  if (r->status & RESH_IN_USE_BIT)
+    {
+      r->res.v.ops->valDestroy(r->res.v.val);
+      reshRemove_(nsp, nspT.idx, __func__);
+    }
 
   LIST_UNLOCK();
 }