[g ++用户定义的动态链接库上的全局new和delete运算符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[g ++用户定义的动态链接库上的全局new和delete运算符相关的知识,希望对你有一定的参考价值。
在g ++上,动态链接库中的代码使用操作员从主程序中删除。通过-Wl,-Bsymbolic
选项,动态链接库使用其自己的运算符new,但使用主程序的运算符delete。使用带有-Wl,-Bsymbolic
选项的clang ++进行编译,会使用其自身的运算符new和delete来动态链接库。在Linux(ubuntu)上
// base_program.cpp
#include <dlfcn.h>
#include <stdio.h>
#include <cstdlib>
typedef void dllFunc();
void *operator new(std::size_t count)
printf("base_program new\n");
void *result = malloc(count);
return result;
void *operator new[](std::size_t count)
printf("base_program new[]\n");
void *result = malloc(count);
return result;
void operator delete(void *ptr) noexcept
printf("base_program delete\n");
free(ptr);
void operator delete[](void *ptr) noexcept
printf("base_program delete[]\n");
free(ptr);
int main(int nArgs, char **args)
void *handle = dlopen(DLLFILE, RTLD_LAZY);
dllFunc *func = (dllFunc*) dlsym(handle, "testFunc");
printf("Linking with %s\n", DLLFILE);
int *a = new int;
delete a;
func();
printf("\n");
return 0;
// linking.cpp
#include <stdio.h>
#include <cstdlib>
void *operator new(std::size_t count)
printf("linking new\n");
void *result = malloc(count);
return result;
void *operator new[](std::size_t count)
printf("linking new[]\n");
void *result = malloc(count);
return result;
void operator delete(void *ptr) noexcept
printf("linking delete\n");
free(ptr);
void operator delete[](void *ptr) noexcept
printf("linking delete[]\n");
free(ptr);
extern "C" void testFunc()
int *a = new int;
delete a;
// build.sh
g++ -g -fPIC -DDLLFILE="\"linking_g.so\"" base_program.cpp -o base_program_g -ldl
g++ -g -fPIC -shared linking.cpp -o linking_g.so -Wl,-Bsymbolic
clang++ -g -fPIC -DDLLFILE="\"linking_clang.so\"" base_program.cpp -o base_program_clang -ldl
clang++ -g -fPIC -shared linking.cpp -o linking_clang.so -Wl,-Bsymbolic
运行./build.sh; ./base_program_g; ./base_program_clang
将得到以下结果
Linking with linking_g.so
base_program new
base_program delete
linking new
base_program delete
Linking with linking_clang.so
base_program new
base_program delete
linking new
linking delete
如何获得g ++中的clang ++行为?
答案
[operator delete
在不同的C ++标准中具有不同的声明,并且您对operator delete
的定义需要C ++ 11。
[您可能使用默认在C ++ 03方言中编译的旧noexcept
版本。
一种修复方法是在命令行上显式设置C ++ 11或更高版本的标准(我用g++
测试过。
以上是关于[g ++用户定义的动态链接库上的全局new和delete运算符的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 动态链接没有与自定义标签上的短 URL 进行深度链接
管理页面上的动态字段 - Postgres 和 MongoDB