C++获取当前路径函数_getcwd,调用完毕手动释放报错。

面具下执光
  • 13

微软官方中文文档内容:

_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 _getcwdwchar_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); 生效,
运行程序就会提示 触发断电:
image.png

是编译器优化的结果,还是C++14的版本都是这样?
触发机制算什么?(抛出错误? 还是中断什么的?)

回复
阅读 2.8k
1 个回答
✓ 已被采纳
Returns a pointer to buffer

buffer 是你传入的,要不要释放要看你的 buffer 是咋来的。你的程序里 buffer 是一个局部数组,当然不能 free 。

_Buffer_参数可以为NULL;使用malloc自动分配_maxlen_大小至少为(仅在必要时更多)的缓冲区,以存储路径。稍后可通过调用free并向其传递_getcwd返回值(指向已分配缓冲区的指针)来释放此缓冲区。

如果传入的 buffer 是 NULL ,那么会自动分配内存。这时需要用 free 释放。


这翻译太难读了 ...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏