【问题标题】:Dereferencing a Function Pointer to Swap the Function取消引用函数指针以交换函数
【发布时间】:2014-11-21 13:16:38
【问题描述】:

我尝试重新定义malloc(),以便在不修改代码的情况下使用自定义分配器。为什么下面的代码不起作用?使用#define 是唯一的解决方案吗?

void *(*malloc_ptr)(size_t) = malloc;
*malloc_ptr = my_malloc;

【问题讨论】:

  • malloc 不是函数指针,而是函数。它可以衰减为函数指针。
  • @Cyber​​:嗯。为什么要删除c++???
  • @Deduplicator 因为虽然这是有效的 C++ 代码,但这本质上只是一个 C 问题。来自 C++ 标签:“C++ 是一种基于 C 的通用编程语言。使用此标签可以解决有关使用 C++ 编译器编译的代码的问题,无论代码在 C、C#、Objective-C 中是否有效和其他基于 C 的编程语言。"
  • @Cyber​​:你从哪里知道他在使用 C 编译器?或者两者都不是?
  • “分配器”一词在 c++ 上下文中令人困惑。我它与 c++ 分配器无关。

标签: c++ c pointers function-pointers


【解决方案1】:

为了可靠地替换内存分配库,请使用 LD_PRELOAD 并将您自己的 malloc 和 free 实现传递给它。

显然您可以创建自己的变量malloc_ptr 并在所有函数中使用它,但请注意其他库函数将调用标准malloc

【讨论】:

  • 我对函数进行了取消引用,就像任何其他原始类型一样。似乎情况并非如此。如果我只是在自定义分配器的头文件中 #define malloc 会出现什么问题?而不是在编译期间链接它。
  • @xiver77:这取决于你的实现。如果您可以保证仅从该特定编译单元调用malloc / free,那可能没问题,#define 会更容易。否则,您可能会遇到崩溃和其他不良行为。
【解决方案2】:

函数指示符没有赋值运算符。

如果你想将一个函数指针分配给另一个函数指针,那么你应该写

malloc_ptr = my_malloc;

【讨论】:

  • 运算符不是“为”任何东西。它们只是语言语法的一部分。你的意思是“赋值表达式”吗?
  • @Kerrek SB 为某个类定义赋值运算符怎么样?
  • @VladfromMoscow:定义事物与此无关。为所有类类型声明了赋值运算符,因此赋值表达式可以由类类型操作数构成。 (当然,如果重载解析失败或删除了所选重载,它们可能仍然是不正确的。)
  • @Kerrek SB 你错了。没有为所有实体定义赋值运算符,尤其是函数指示符
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多