c++ - abi::__cxa_demangle -- 为什么缓冲区需要 `malloc` -ed?

标签 c++ api abi demangler

abi::__cxa_demangle 的文档(例如 https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html )指定第二个参数 char * output_buffer ,需要是malloc -ed。

这意味着不允许在堆栈上分配如下所示的字符缓冲区。

  enum {N = 256};
  char output_buffer[N];
  size_t output_length = 0;
  int status = -4;
  char * const result = std::__cxa_demangle(mangled_name,
                        output_buffer, &output_length, &status);

两个问题:

  1. 为什么是 output_buffer不允许在堆栈上?

  2. 为什么当输出缓冲区已经传递时返回不同的指针?

受到backtrace()例子的影响,我会想象一个像下面这样的 API

// Demangle the symbol in 'mangled_name' and store the output
// in 'output_buffer' where 'output_buffer' is a caller supplied
// buffer of length 'output_buffer_length'. The API returns the 
// number of bytes written to 'output_buffer' which is not
// greater than 'output_buffer_length'; if it is
// equal to 'output_buffer_length', then output may have been
// truncated.
size_t mydemangle(char const * const mangled_name,
                  char * output_buffer,
                  size_t const output_buffer_length);

最佳答案

1) 为什么不允许在堆栈上使用output_buffer?

来自您提供的链接。 如果output_buffer不够长,则使用realloc对其进行扩展。无法调整堆栈上数据的大小,因为堆栈帧通常具有固定大小(特殊情况alloca)

2)为什么当输出缓冲区已经传递时返回不同的指针?

当使用 realloc 时,没有理由认为您会返回相同的指针。例如,如果该位置没有足够的连续可用内存,操作系统将需要在其他地方分配内存。

如果我必须猜测为什么 API 是这样设计的,那么通常认为最好的做法是不在函数中分配内存,然后返回对该内存的引用。相反,让调用者负责分配和释放。这有助于避免意外的内存泄漏,并允许 API 用户设计自己的内存分配方案。我很欣赏这样的事情,因为它允许用户利用自己的内存管理方案来避免内存碎片等问题。虽然 realloc 的潜在用途有点困惑了这个想法,但您可能可以通过为输出参数分配足够大的 block 来解决这个问题,这样就永远不会调用 realloc 。

关于c++ - abi::__cxa_demangle -- 为什么缓冲区需要 `malloc` -ed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45022504/

相关文章:

c++ - deleteLater() 在 qt 中是如何工作的?

c++ - 我可以逆转数组到指针衰减的过程吗?

windows - LoadLibrary 卡住

c - 有没有一种标准的方法来重建降低的结构函数参数?

linux - 通过 linux x86-64 函数调用保留了哪些寄存器

c++ - 无法将我的解决方案中的其他项目与 premake 链接起来

c++ - "Catch"通过 SendMessage 方法发送的所有消息

c++ - 如何使用 SetTimer API

python - 尝试使用字典中的键时出现 "list indices must be integers"错误

x86 - ELF 或二进制文件中有特定 ABI 的签名吗?