diff --git a/README.md b/README.md
index 429ff69c6..265b51595 100755
--- a/README.md
+++ b/README.md
@@ -346,6 +346,7 @@ Remark:
 
 ## History
 
+* v2.0, 2017-01-22, for [#752][bug #752] release the io then free it for kbps. 2.0.232
 * v2.0, 2017-01-18, fix [#750][bug #750] use specific error code for dns resolve. 2.0.231
 * v2.0, 2017-01-18, [2.0 beta4(2.0.230)][r2.0b4] released. 86334 lines.
 * v2.0, 2017-01-18, fix [#749][bug #749], timestamp overflow for ATC. 2.0.230
@@ -1283,6 +1284,7 @@ Winlin
 [bug #740]: https://github.com/ossrs/srs/issues/740
 [bug #749]: https://github.com/ossrs/srs/issues/749
 [bug #750]: https://github.com/ossrs/srs/issues/750
+[bug #752]: https://github.com/ossrs/srs/issues/752
 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx
 
 [exo #828]: https://github.com/google/ExoPlayer/pull/828
diff --git a/trunk/src/app/srs_app_edge.cpp b/trunk/src/app/srs_app_edge.cpp
index 15e78eaee..754f9cc0a 100755
--- a/trunk/src/app/srs_app_edge.cpp
+++ b/trunk/src/app/srs_app_edge.cpp
@@ -110,9 +110,9 @@ void SrsEdgeIngester::stop()
     
     close_underlayer_socket();
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
-    kbps->set_io(NULL, NULL);
     
     // notice to unpublish.
     _source->on_unpublish();
@@ -376,6 +376,7 @@ int SrsEdgeIngester::connect_server(string& ep_server, string& ep_port)
         return ret;
     }
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
     
@@ -478,9 +479,9 @@ void SrsEdgeForwarder::stop()
     
     queue->clear();
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
-    kbps->set_io(NULL, NULL);
 }
 
 #define SYS_MAX_EDGE_SEND_MSGS 128
@@ -626,6 +627,7 @@ int SrsEdgeForwarder::connect_server(string& ep_server, string& ep_port)
         return ret;
     }
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
     
diff --git a/trunk/src/app/srs_app_forward.cpp b/trunk/src/app/srs_app_forward.cpp
index 9fd95fac3..7698cb5bc 100755
--- a/trunk/src/app/srs_app_forward.cpp
+++ b/trunk/src/app/srs_app_forward.cpp
@@ -150,9 +150,9 @@ void SrsForwarder::on_unpublish()
     
     close_underlayer_socket();
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
-    kbps->set_io(NULL, NULL);
 }
 
 int SrsForwarder::on_meta_data(SrsSharedPtrMessage* shared_metadata)
@@ -313,6 +313,7 @@ int SrsForwarder::connect_server(string& ep_server, string& ep_port)
         return ret;
     }
     
+    kbps->set_io(NULL, NULL);
     srs_freep(client);
     srs_freep(io);
     
diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp
index 546c538e4..77ee2d257 100644
--- a/trunk/src/core/srs_core.hpp
+++ b/trunk/src/core/srs_core.hpp
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // current release version
 #define VERSION_MAJOR       2
 #define VERSION_MINOR       0
-#define VERSION_REVISION    231
+#define VERSION_REVISION    232
 
 // generated by configure, only macros.
 #include 
diff --git a/trunk/src/protocol/srs_protocol_kbps.hpp b/trunk/src/protocol/srs_protocol_kbps.hpp
index dd5a8ada0..0bb7f88b6 100644
--- a/trunk/src/protocol/srs_protocol_kbps.hpp
+++ b/trunk/src/protocol/srs_protocol_kbps.hpp
@@ -161,7 +161,7 @@ public:
  *      SrsKbps* kbps = ...;
  *      kbps->set_io(in, out);
  *      // both kbps->get_recv_bytes() and kbps->get_send_bytes() are available.
-*       // we can use the kbps as the data source of another kbps:
+ *       // we can use the kbps as the data source of another kbps:
  *      SrsKbps* user = ...;
  *      user->set_io(kbps, kbps);
  *   the server never know how many bytes already send/recv, for the connection maybe closed.
@@ -176,14 +176,15 @@ public:
     virtual ~SrsKbps();
 public:
     /**
-    * set io to start new session.
-    * set the underlayer reader/writer,
-    * if the io destroied, for instance, the forwarder reconnect,
-    * user must set the io of SrsKbps to NULL to continue to use the kbps object.
-    * @param in the input stream statistic. can be NULL.
-    * @param out the output stream statistic. can be NULL.
-    * @remark if in/out is NULL, use the cached data for kbps.
-    */
+     * set io to start new session.
+     * set the underlayer reader/writer,
+     * if the io destroied, for instance, the forwarder reconnect,
+     * user must set the io of SrsKbps to NULL to continue to use the kbps object.
+     * @param in the input stream statistic. can be NULL.
+     * @param out the output stream statistic. can be NULL.
+     * @remark if in/out is NULL, use the cached data for kbps.
+     * @remark User must set_io(NULL, NULL) then free the in and out.
+     */
     virtual void set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out);
 public:
     /**