C++ 重载new/delete和STL在共享库中的应用

C++ 重载new/delete和STL在共享库中的应用,c++,gcc,stl,operator-overloading,std,C++,Gcc,Stl,Operator Overloading,Std,我遇到了一个问题,它是由重载操作符new/delete和STL(特别是std::string)的联合引起的。这是我的案子 我编译共享库(称之为libfoo.so),其中重载操作符new和delete。为了不影响将使用此库的程序,我将符号新建和删除隐藏起来。 此外,我的库使用STL,特别是std::string,正如我所期望的,它应该使用我的操作符new/delete,因为它是模板类 当我用-O1和更高版本编译库时,我得到了SIGABRT,这是由于在basic_字符串构造函数/析构函数中使用了不同

我遇到了一个问题,它是由重载操作符new/deleteSTL(特别是std::string)的联合引起的。这是我的案子

我编译共享库(称之为libfoo.so),其中重载操作符newdelete。为了不影响将使用此库的程序,我将符号新建删除隐藏起来。 此外,我的库使用STL,特别是std::string,正如我所期望的,它应该使用我的操作符new/delete,因为它是模板类

当我用-O1和更高版本编译库时,我得到了SIGABRT,这是由于在basic_字符串构造函数/析构函数中使用了不同的操作符new/delete造成的new是从libstdc++调用的。因此,从我的库中调用delete

当我使用-O0或-fno编译库时,基本的内联运算符new/delete,字符串构造函数/析构函数都是从libstdc++调用的

我举了最简单的例子来说明这种行为:
Readme.md中提供了再现错误的步骤

这是优化的正常行为吗?或者我应该以不同的方式使用std::string?如何强制我的库中的stl类使用我的新建/删除?假设我的真实库有大量stl类,因此我无法为每个类重新定义分配器:(

我使用glibc2.27,gcc5.5.0

乐于倾听任何想法:)


谢谢

您的基本问题是,您正在尝试使用多个不同的全局
操作符new
s,一个在您的动态库中,另一个用于使用您的动态库的任何其他人

只能有一个。这就是为什么它被称为全局操作符

如果你有不止一个,你可以得到你所看到的行为。(或者别的什么,你正在走进UB的土地)

(稍后)
libstdc++和libc++都在动态库中外部实例化
std::basic_string
(又称
std::string
)。这意味着当您在
string
中调用非内联方法时,您正在从动态库中运行代码,而动态库不会使用隐藏运算符new/delete来分配/释放内存

您的基本问题是,您正在尝试使用多个不同的全局
操作符new
s,一个在您的动态库中,另一个用于使用您的动态库的任何其他人

只能有一个。这就是为什么它被称为全局操作符

如果你有不止一个,你可以得到你所看到的行为。(或者别的什么,你正在走进UB的土地)

(稍后)
libstdc++和libc++都在动态库中外部实例化
std::basic_string
(又称
std::string
)。这意味着当您在
string
中调用非内联方法时,您正在从动态库中运行代码,而动态库不会使用隐藏运算符new/delete来分配/释放内存

new
delete
有不同的重载。我真的不知道
std::string
的实现在幕后做了什么。如果我是你,我真的不会采用这种方法,相反,我会实现一个自定义分配器并在容器上使用它。尽管如此,这可能解释了你遇到的问题。
new
delete
有不同的重载。我真的不知道
std::string
的实现在幕后做了什么。如果我是你,我真的不会采用这种方法,相反,我会实现一个自定义分配器并在容器上使用它。尽管如此,这可能解释了你遇到的问题。解决我问题的最佳方法是不要使全局新建/删除超负荷。不幸的是,我没有这样的选择(解决我的问题的最好办法不是让全局新建/删除超负荷。不幸的是,我没有这样的选择:(