Actually, deadbaad is what the libc abort() function uses to kill the process. 99% of the time the code calling abort() is in malloc/free, but it's certainly possible that something else could be calling it.
My recommendation to anyone doing native development is to make sure CheckJNI is enabled (it's on by default in the emulator, and you can turn it on with "setprop dalvik.vm.checkjni true ; stop ; start" on a rooted device). You can also try some of the enhanced memory checking modes. "setprop libc.debug.malloc 10" will turn on some native heap malloc guards, and "setprop dalvik.vm.jniopts forcecopy" will add some memory buffer protection to CheckJNI.
https://groups.google.com/forum/#!topic/android-ndk/jQg6DM6-D6o