C++ g++;动态链接库上的用户定义全局新建和删除运算符

C++ g++;动态链接库上的用户定义全局新建和删除运算符,c++,linux,gcc,dll,clang,C++,Linux,Gcc,Dll,Clang,在g++上,来自动态链接库的代码使用主程序中的运算符delete。 使用-Wl,-Bsymbolic选项,动态链接库使用自己的运算符new,但使用主程序的运算符delete。 使用带有-Wl,-Bsymbolic选项的clang++进行编译时,会使用自己的运算符new和delete动态链接库。 在linux(ubuntu)上 < P>在不同C++标准中有不同的声明。使用noexcept的定义需要C++11 您可能使用了一个旧的g++版本,默认情况下使用C++03方言编译 修复方法是在命令行上显

在g++上,来自动态链接库的代码使用主程序中的运算符delete。 使用
-Wl,-Bsymbolic
选项,动态链接库使用自己的运算符new,但使用主程序的运算符delete。 使用带有
-Wl,-Bsymbolic
选项的clang++进行编译时,会使用自己的运算符new和delete动态链接库。 在linux(ubuntu)上

<如何在G++中获得CLAN++行为?< /P> < P>在不同C++标准中有不同的声明。使用
noexcept
的定义需要C++11

您可能使用了一个旧的
g++
版本,默认情况下使用C++03方言编译


修复方法是在命令行上显式设置C++11或更新的标准。我用
-std=gnu++11
进行了测试,它解决了您的问题。

我再次检查,发现
-std=gnu++11
有效,但它停止使用
-std=gnu++14
-std=gnu++17
@CalvinKu注意,此选项有一个破折号,例如,
-std=…
而不是
-std=…
@CalvinKu您的构建脚本会忽略失败。确保重建源代码。
// 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

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