When OnDataChannel fires, it actually gives you a "proxy" object. When a method on the proxy object is called, it will invoke it on the correct thread, so it provides added safety/convenience to the application.
Just like the actual DataChannel underneath, the proxy object is reference counted. So unless you obtain a reference to it, it will go out of scope and be deleted after the OnDataChannel callback.
So, even though the actual DataChannel is alive and providing you callbacks, the pointer to the proxy object you have is invalid. To avoid this you need to either use a scoped_refptr or call AddRef/Release.
I realize that if OnDataChannel fired with a scoped_refptr instead of a raw pointer, this confusion probably could have been avoided. I'll make a note to myself to look into changing the API in that way.