GetTempPathA 函数在打印结果后崩溃

GetTempPathA function crashes after printing result

本文关键字:崩溃 结果 打印 函数 GetTempPathA      更新时间:2023-10-16

我正在尝试使用 GetTempPathA 函数获取 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作为一个值,因为它解决了谷歌网上论坛上的其他人的问题。

new CHAR(MAX_PATH)

您可以为单个CHAR分配空间,并将该空间初始化为MAX_PATH 。这意味着您对 GetTempPathA 的调用将超出该单个 CHAR 元素的范围,从而导致未定义的行为

你可能的意思是

new CHAR[MAX_PATH]

它分配一个MAX_PATH元素数组。

哇,我们应该从哪里开始?

主要问题是表达式

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);

无论如何,值得一提的是,newnew[]deletedelete[]在现代C++中不再使用。 为 IO 操作选择std::vectorstd::string原始内存,其余所有操作std::unique_ptr/std::shared_ptr