The problem is your allocating new memory on every call and not calling delete  to free it. Next problem is if you free it you can't return it which is why I suggested passing a buffer to hold the output. This is better suited to be a class though.
Something like this
A better solution is to use the pre-build event in VS and write a script using python, perl whatever to generate a header file with encoded strings. The advantage here is the script knows how many strings there are, the max length and can make a random key on each new build. I do this but use a class to access them, the class keeps track if a string is already decoded or not, allows you to have a valid pointer to a given string at all times etc.
char* Decrypt( char* pIn, char* pOut, int BufSize)
int length = strlen(pIn);
if (length > BufSize) return 0;
//do your encode/decode and write output into pOut
char* pDecoded = new char;
if ( Decrypt( "encodedstring", pDecoded, 64) )
// free the memory when done
// note the  used with delete, this is because you used new char
delete  pDecoded;
This is basically how i access do mine using a class and pre-build event to create the header file.
Think on the class based solution and build events would make a nice project for you to tinker with.
// to retrieve or decode a string
char* pStr = g_pStringManager->GetChar( STR_SOME_STRING );
// End of render frame secure them
//In header file I simply generate defines
#define STR_SOME_STRING "encoded_string_data"