簡體   English   中英

動態鏈接庫上的 g++ 用戶定義的全局 new 和 delete 運算符

[英]g++ user-defined global new and delete operators on dynamically linked libraries

在 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 ./build.sh; ./base_program_g; ./base_program_clang ./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++ 標准中有不同的聲明。 您使用noexcept定義需要 C++11。

您可能使用默認情況下以 C++03 方言編譯的舊g++版本。

修復方法是在命令行上顯式設置 C++11 或更新的標准。 我使用-std=gnu++11進行了測試,它解決了您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM