GetTempPath()是否写入的内存多于发送的内存?

时间:2016-01-21 14:32:42

标签: c++ visual-studio-2013

执行此代码时,函数结尾处会抛出以下错误

"运行时检查失败#2 - 围绕变量'路径'被腐蚀了#34;

TCHAR path[1024]={0};
GetTempPathW((sizeof(path)) - 1, path);

我意识到变量'路径'声明将分配2048字节。

执行时,'路径'几乎不到32字节就被填满了。但它将0到2048的其余部分(在初始化时已经为0)以及额外的2044字节设置为0。

(即)额外的2044个字节被设置为0.(它不应该访问)

有人可以告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

来自此处的文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992(v=vs.85).aspx

  

nBufferLength [in]

     

由lpBuffer标识的字符串缓冲区的大小,在 TCHAR 中。

考虑这样的事情:

// buffer size in TCHARS
static constexpr DWORD buffer_size = MAX_PATH+1;

// make enough space, regardless of the size of a TCHAR
TCHAR buffer[buffer_size];   

// communicate buffer length in terms of numbers of TCHARS
auto path_len = GetTempPath(buffer_size, buffer);

// check path_len for 0 - that would indicate an error

或者如果您愿意,

TCHAR buffer[MAX_PATH + 1];

// communicate buffer length in terms of numbers of TCHARS
auto path_len = GetTempPath(std::extent<decltype(buffer)>::value,
                            buffer);

// check path_len for 0 - that would indicate an error