I am sure the following has a rational explanation but I am nevertheless a bit baffled.
The issue is with a function which creates a _TCHAR[CONSTANT], a _TCHAR*, concatenates them and returns the result.
For some reason the call to whatTheHeck() from _tmain() returns gibberish.
_TCHAR* whatTheHeck(_TCHAR* name) {
_TCHAR Buffer[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
_TCHAR* what = new _TCHAR[BUFSIZE];
what = _tcscat(Buffer, TEXT("\\"));
what = _tcscat(what, name);
return what;
}
int _tmain(int argc, _TCHAR* argv[]) {
_TCHAR* failure = whatTheHeck(TEXT("gibberish);")); // not again ..
_tprintf(TEXT("|--> %s\n"), failure);
_TCHAR* success = createFileName(TEXT("readme.txt")); // much better
_tprintf(TEXT("|--> %s\n"), success);
return 0;
}
In contrast, when going with heap things work as expected.
_TCHAR* createFileName(_TCHAR* name) {
_TCHAR* Buffer = new _TCHAR[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
Buffer = _tcscat(Buffer, TEXT("\\"));
Buffer = _tcscat(Buffer, name);
return Buffer;
}
Why the difference?
Is it because _tcscat() concatenates memory addresses instead of their contents and return purges the stack?
There are lots of problems with your code. Let's take it apart, shall we:
_TCHAR* whatTheHeck(_TCHAR* name) // We're inside a local scope
{
_TCHAR Buffer[BUFSIZE]; // "Buffer" has automatic storage
_TCHAR* what = new _TCHAR[BUFSIZE]; // "what" points to newly allocated dyn. memory
what = _tcscat(Buffer, TEXT("\\")); // Oh no, we overwrite "what" - leak!
// Now what == Buffer.
what = _tcscat(what, name); // Equivalent to "_tcscat(Buffer, name)"
return Buffer; // WTPF? We're returning a local automatic!
}
As you can see, you are both causing a memory leak with a gratuitious and reckless new, and you are also returning the address of a local object past its lifetime!
I would strongly recommmend
- reading the documentation for
strcat and understanding "source" and "destination",
- not using
strcat, but a safer version like strncat,
- not using
strncat, but instead std::string.