C++获取当前路径函数_getcwd,调用完毕手动释放报错。
微软官方中文文档内容:
_getcwd、_wgetcwd
- 2019年09月24日
语法
char *_getcwd(
char *buffer,
int maxlen
);
wchar_t *_wgetcwd(
wchar_t *buffer,
int maxlen
);
参数Parameters[]
宽限__buffer
路径的存储位置。Storage location for the path.
maxlen__maxlen
路径的最大长度(字符): char for _getcwd , wchar_t用于 _wgetcwd。
返回值Return Value[]
返回一个指向_缓冲区_的指针。Returns a pointer to _buffer_. 空返回值指示错误, Errno设置为ENOMEM,指示内存不足,无法分配_maxlen_字节(当空参数作为_缓冲区_提供时)或ERANGE,指示路径长度超过_maxlen_个字符。如果_maxlen_小于或等于零,此函数将调用无效参数处理程序,如[参数验证]中所述。
备注
_Getcwd函数获取默认驱动器的当前工作目录的完整路径,并将其存储在_缓冲区_中。 如果路径长度(包括终止 null 字符)超过_maxlen_,则会出现错误。 _Buffer_参数可以为NULL;使用malloc自动分配_maxlen_大小至少为(仅在必要时更多)的缓冲区,以存储路径。稍后可通过调用free并向其传递 _getcwd返回值(指向已分配缓冲区的指针)来释放此缓冲区。
_getcwd返回一个字符串,该字符串表示当前工作目录的路径。如果当前工作目录是根,则字符串以反斜杠(\
)结尾。如果当前工作目录为根目录之外的目录,则字符串以目录名称结尾,而不是以反斜杠结尾。
定义 _debug和 _CRTDBG_MAP_ALLOC时,对 _getcwd和 _wgetcwd的调用将替换为对 _getcwd_dbg和 _wgetcwd_dbg的调用,以允许调试内存分配。
接下来是我的正确能调试通过的程序:
#include <iostream>
#include<string>
#include<memory>
#include<direct.h> //获取路径
#include <stdio.h>
#include <stdlib.h>
#ifndef MAX_PATH
#define MAX_PATH 80
#endif // !MAX_PATH 80
using namespace std;
int main()
{
char buffer[MAX_PATH];
auto path_buff=_getcwd(buffer, MAX_PATH);
cout << path_buff << endl;
//free(path_buff);
cout << "Ban Ji Tino!\n";
}
编译通过,正确运行
输出结果是:
*D:VS programnested classnested class test1
*Ban Ji Tino!
但如果把main函数中free(path_buff);
生效,
运行程序就会提示 触发断电:
是编译器优化的结果,还是C++14的版本都是这样?
触发机制算什么?(抛出错误? 还是中断什么的?)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
buffer 是你传入的,要不要释放要看你的 buffer 是咋来的。你的程序里 buffer 是一个局部数组,当然不能 free 。
如果传入的 buffer 是 NULL ,那么会自动分配内存。这时需要用 free 释放。
这翻译太难读了 ...