sprintf / snprintf是否分配了额外的内存?

我正在编写一个库,并希望使它绝对与资源无关,这也意味着库应该与用户提供的内存分配功能一起使用.库允许用户也设置自己的错误处理函数,这些函数使用错误消息作为参数调用,如下所示:
typedef void (*error_handler)(const char* msg);

代码自己准备错误消息,就像那样(消息格式化失败的情况):

char buf[BUF_SIZE];
snprintf(buf,BUF_SIZE,"Oops found at file '%s' line %d",__FILE__,__LINE__);

但是我可以确定snprintf不会为malloc的内部使用分配更多的内存,显然会绕过用户提供的分配例程吗?我的Linux系统中的手册页对此保持沉默.

解决方法

与任何库例程一样,sprintf和snprintf可能会也可能不会为内部使用分配内存.

它们不会为结果字符串分配内存.必须由调用者以某种方式分配该内存,并将其地址作为第一个参数传递.如果分配的内存不够大,那么sprintf将具有未定义的行为(因为没有办法告诉它有多少可用空间),并且snprintf将截断结果(假设size参数是准确的).

如果sprintf或snprintf的实现分配内存并且没有安排它被释放,那将是内存泄漏.这样的泄漏实际上不会违反语言标准(对资源分配没什么好说的),但它会被认为是该实现中的一个错误.

特别是,如果您自己的代码使用自己的内存分配器而不是malloc,那么您调用的任何库函数都可以在内部调用malloc,除非您使用某些特定于系统的功能调用malloc(即使在标准库中)调用您的分配器代替.例如,fopen()特别有可能为缓冲区分配内存.

如果您通过调用自己的分配器来替换标准库对malloc的调用,则需要确保还替换对realloc,calloc和free以及可能的一个或多个特定于系统的例程的任何调用.例如,在程序完成时运行的清理代码关闭打开的文件,这可能涉及对free的调用.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...