我尝试使用GetTempPathA function在Windows上获取用户的临时文件夹。
LPSTR ptcPath = new CHAR(MAX_PATH);
GetTempPathA(MAX_PATH - 1, ptcPath);
std::cout << "Temporary path : " << ptcPath << std::endl;
因此程序正确输出临时路径,但在此之后崩溃(它是大代码的一部分)。
我确定崩溃来自GetTempPathA,因为如果我对该行进行评论,该程序可以正常工作。
除了打印乱码的MAX_PATH - 1
下的所有值外,它会崩溃我分配或放置的大小而不是<size of the path> + 1
。
我将MAX_PATH - 1
作为值,因为它解决了Google Groups上其他人的问题。
答案 0 :(得分:5)
使用
new CHAR(MAX_PATH)
为单 CHAR
分配空间并将其初始化为MAX_PATH
。这意味着您对GetTempPathA
的调用将写出单个CHAR
元素的界限,从而导致未定义的行为。
你可能意味着
new CHAR[MAX_PATH]
分配一个MAX_PATH
元素数组。
答案 1 :(得分:1)
主要问题是表达式
new CHAR(MAX_PATH);
这不分配一个字符数组,但只有一个,MAX_PATH
的值的单数字符。
char* c = new char(static_cast<char>(MAX_PATH))
但是,只需使用std::string
必须保持其内部缓冲区连续的事实:
std::string buffer;
buffer.resize(MAX_PATH + 1);
const auto new_size = GetTempPathA(buffer.size(), &buffer[0]); //deal with newsize == 0
buffer.resize(new_size);
无论如何,值得一提的是现代C ++中不再使用new
,new[]
,delete
,delete[]
。选择std::vector
和std::string
作为IO操作的原始内存,并选择std::unique_ptr
/ std::shared_ptr
。