Unexplained crashes are often the result after trying to read memory that doesn't exist. For example you give a pointer that was referencing to an object like an entity, but you deleted that entity. The pointer now points to an address that does not have the entity anymore (and likely something totally different). If you use it, big chance it crashes, or it gives funny behaviour but that is a small chance. Either way is not good. Pointer management is very difficult and errors can be very hard to find.
Try if all the pointers you give to the involved functions contain proper objects.
enet_ent_create(_str("images/effects/nothing.pcx"),my.x,_str("MgTarget"));
Does the first argument hold the proper path to the image?
Is my not null?
Are you sure you need _str() to create the string? AFAIK the strings will be deleted when the function end, and if enet_ent_create is still using them in the process, it will crash. Use str_create() instead.
I suggest put the _str() functions outside the arguments into separate string variables and consider using str_create().