打印结果后GetTempPathA函数崩溃

时间:2017-06-13 12:39:23

标签: c++ windows

我尝试使用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上其他人的问题。

2 个答案:

答案 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 ++中不再使用newnew[]deletedelete[]。选择std::vectorstd::string作为IO操作的原始内存,并选择std::unique_ptr / std::shared_ptr