Если вы хотите остаться стандартным, getcwd
не требуется ничего делать, если вы передаете ему значение NULL; вместо этого вы должны выделить в стеке буфер, который является «достаточно большим» для большинства случаев (скажем, 255 символов), но будьте готовы к случаю, когда getcwd
может потерпеть неудачу с errno==ERANGE
; в этом случае вы должны динамически выделить больший буфер и при необходимости увеличить его размер.
Нечто подобное может сработать (обратите внимание: не проверено, просто написано с нуля, может быть несомненно улучшено):
string getcwd()
{
const size_t chunkSize=255;
const int maxChunks=10240; // 2550 KiBs of current path are more than enough
char stackBuffer[chunkSize]; // Stack buffer for the "normal" case
if(getcwd(stackBuffer,sizeof(stackBuffer))!=NULL)
return stackBuffer;
if(errno!=ERANGE)
{
// It's not ERANGE, so we don't know how to handle it
throw std::runtime_error("Cannot determine the current path.");
// Of course you may choose a different error reporting method
}
// Ok, the stack buffer isn't long enough; fallback to heap allocation
for(int chunks=2; chunks<maxChunks ; chunks++)
{
// With boost use scoped_ptr; in C++0x, use unique_ptr
// If you want to be less C++ but more efficient you may want to use realloc
std::auto_ptr<char> cwd(new char[chunkSize*chunks]);
if(getcwd(cwd.get(),chunkSize*chunks)!=NULL)
return cwd.get();
if(errno!=ERANGE)
{
// It's not ERANGE, so we don't know how to handle it
throw std::runtime_error("Cannot determine the current path.");
// Of course you may choose a different error reporting method
}
}
throw std::runtime_error("Cannot determine the current path; the path is apparently unreasonably long");
}
Кстати, в вашем коде есть очень неправильная вещь: вы пытаетесь выделить a_cwd (который, по-видимому, в нестандартном расширении выделяется с помощью malloc или с какой-либо другой функцией выделения памяти, поскольку getcwd предназначен для C) с delete
: вы абсолютно не должны этого делать, имейте в виду, что каждый метод выделения имеет свой аналог освобождения, и они не должны быть несовпадающими.