diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 458f6c3ace0a90cdc12383bb008503b610e21d7c..594bacd9660e4091ac2fe29c703e33b2ee0aaba1 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -91,6 +91,7 @@ intptr_t _int_ptr(void*, class_t);
 void* _from_int_ptr(void **ptr_out, intptr_t int_ptr_value, class_t);
 error *_get_info(void *ptr, class_t class_, cl_uint param, generic_info *out);
 void _delete(void *ptr, class_t class_);
+error *_release_memobj(void* ptr);
 
 void pyopencl_free_pointer(void*);
 void pyopencl_free_pointer_array(void**, uint32_t size);
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 3aeb863c9257447476e56225ef020478164b687c..b2cb1ffb8b33656ddc35c8cd883cd78f98404fda 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -435,8 +435,8 @@ class MemoryObjectHolder(_Common):
 
 
 class MemoryObject(MemoryObjectHolder):
-    pass
-
+    def release(self):
+        _handle_error(_lib._release_memobj(self.ptr))
 
 def _c_buffer_from_obj(obj, writable=False):
     """Convert a Python object to a tuple (cdata('void *'), num_bytes, dummy)
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 33619a43b7b035e5bc569da8ef05d8afd705946b..74c47cb8990edf674743a97f7f901c3ce10294b6 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -3432,7 +3432,6 @@ intptr_t _int_ptr(void* ptr, class_t class_) {
   SWITCHCLASS(INT_PTR);
 }
 
-
 void* _from_int_ptr(void **ptr_out, intptr_t int_ptr_value, class_t class_) {
 #define FROM_INT_PTR(CLSU, CLS) \
   BEGIN_C_HANDLE_ERROR \
@@ -3465,6 +3464,14 @@ void _delete(void *ptr, class_t class_) {
   SWITCHCLASS(DELETE);
 }
 
+::error*
+_release_memobj(void* ptr)
+{
+    BEGIN_C_HANDLE_ERROR;
+    static_cast<pyopencl::memory_object*>(ptr)->release();
+    END_C_HANDLE_ERROR;
+    return NULL;
+}
 
 int pyopencl_get_cl_version(void) {
   return PYOPENCL_CL_VERSION;