内存管理API之kstrndup

char *kstrndup(const char *s, size_t max, gfp_t gfp) 这个函数的作用和kstrlen的作用相同,但是它
限制了字符串的长度不能超过形参max
其源码分析如下:
/**
 * kstrndup - allocate space for and copy an existing string
 * @s: the string to duplicate
 * @max: read at most @max chars from @s
 * @gfp: the GFP mask used in the kmalloc() call when allocating memory
 *
 * Note: Use kmemdup_nul() instead if the size is known exactly.
 */
char *kstrndup(const char *s, size_t max, gfp_t gfp)
{
	size_t len;
	char *buf;
	#形参s不能为null
	if (!s)
		return NULL;
	#字符串的长度最大值为max。这里也就是取字符串长度和形参max的最小值
	len = strnlen(s, max);
	#申请buf,主要这里buf如果为null的话,整个函数也就返回为null了
	buf = kmalloc_track_caller(len+1, gfp);
	if (buf) {
		memcpy(buf, s, len);
		#字符串的结尾处添加结束符
		buf[len] = '\0';
	}
	#返回buf,正常情况下这个buf中已经包含形参s中的内容了
	return buf;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,管理内存的API主要包括以下几种: 1. new/delete运算符:用于动态分配和释放内存空间。通过new运算符可以在堆上动态地分配一块内存,返回指向该内存的指针;通过delete运算符可以释放之前分配的内存,避免内存泄漏。例如: ```cpp int *p = new int; *p = 10; delete p; ``` 2. malloc/free函数:用于动态分配和释放内存空间。malloc函数可以在堆上动态地分配一块内存,返回指向该内存的指针;free函数可以释放之前分配的内存,避免内存泄漏。例如: ```cpp int *p = (int*)malloc(sizeof(int)); *p = 10; free(p); ``` 3. calloc/realloc/free函数:calloc函数用于动态分配一块内存,并将其中的所有位初始化为0;realloc函数用于重新调整之前分配的内存大小;free函数用于释放之前分配的内存,避免内存泄漏。例如: ```cpp int *p = (int*)calloc(1, sizeof(int)); *p = 10; p = (int*)realloc(p, 2 * sizeof(int)); free(p); ``` 4. unique_ptr/shared_ptr/weak_ptr智能指针:用于管理动态分配的内存,避免内存泄漏和悬空指针问题。智能指针是一种封装了指针的类,可以自动释放指针所指向的内存空间。例如: ```cpp std::unique_ptr<int> p(new int(10)); std::shared_ptr<int> q = std::make_shared<int>(20); std::weak_ptr<int> r = q; ``` 以上这些API都可以用于管理内存,但使用方法和适用场景略有不同。在实际开发中,我们需要根据具体需求选择合适的API,避免内存泄漏和悬空指针等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值