g++用户定义的动态链接库上的全局new和delete运算符
g++ user-defined global new and delete operators on dynamically linked libraries
在g++上,来自动态链接库的代码使用主程序中的运算符delete。使用-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 newn");
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 deleten");
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 %sn", 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 newn");
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 deleten");
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++中的叮当行为?
operator delete
在不同的C++标准中有不同的声明。您对noexcept
的定义需要C++11。
您可能使用默认情况下使用C++03方言编译的旧g++
版本。
修复方法是在命令行上显式设置C++11或更新的标准。我用-std=gnu++11
进行了测试,它解决了您的问题。
相关文章:
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- QQuickView new-delete-type-mismatch
- 创建 myNew/myDelete 以替换 new/new[]/delete/delete[]
- 为多线程环境包装 c++ new/delete 的安全/好方法
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- C++内存分配失败(使用 new & delete)
- c++重载运算符new delete
- 在 C++ 中将 malloc/free 替换为 new/delete
- new/delete 和 ::new/::d elete 有什么区别?
- 我什么时候应该在C++中重载new/delete
- 在C++中,"new/delete"在结构上代替"malloc/free"有多好?
- 为什么我的信号槽比QThreadPool+new+delete慢
- malloc()/free()/new/delete/delete[] 的算法复杂度是多少?
- C++中new[]/delete[]与new/delete之间的差异
- 标准C++的哪些部分将调用malloc/free而不是new/delete
- C++中的 malloc/free 和 new/delete 兼容性
- 编译器将 malloc/free 或 new/delete 对优化为 alloca
- 在 ANSI C 中使用 new/delete 的缺点
- 为什么使用 malloc/free,当我们有 new/delete 时
- c++如何知道在new/delete之后指向内存的位置