GetTempPathA 函数在打印结果后崩溃
GetTempPathA function crashes after printing result
我正在尝试使用 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);
无论如何,值得一提的是,new
、new[]
、delete
、delete[]
在现代C++中不再使用。 为 IO 操作选择std::vector
和std::string
原始内存,其余所有操作std::unique_ptr
/std::shared_ptr
。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 当回溯以零开始时,如何调试崩溃
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- CoInitialize()在单独的线程上崩溃而不返回
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 使用调试/崩溃报告将应用程序部署到客户端
- GetTempPathA 函数在打印结果后崩溃
- 收到Rcpp函数的结果后会话崩溃
- OpenMP崩溃会产生错误的结果
- std::字符串在迭代 mySQL 连接器查询结果时崩溃
- 结果集 ->getString() 在值为 >=16 时崩溃