【发布时间】:2020-08-05 17:26:03
【问题描述】:
我遇到了由重载运算符 new/delete 和 STL 联合引起的问题(尤其是 std::string)。这是我的情况...
我编译共享库(称为 libfoo.so),在其中重载运算符 new 和 delete。为了不影响将使用该库的程序,我将符号 new 和 delete 隐藏了。 我的库也使用 STL,尤其是 std::string,正如我所料,它应该使用我的运算符 new/delete,因为它是模板类。
当我使用 -O1 及更高版本编译库时,我得到 SIGABRT,这是由于在 basic_string 构造函数/析构函数中使用了不同的运算符 new/delete 造成的。 new 是从 libstdc++.so 调用的,但 delete 是从我的库调用的。
当我使用 -O0 或 -fno-inline 运算符编译库时,new/delete 用于 basic_string 构造函数/析构函数都从 libstdc++ 调用。
我做了一个最小的例子来展示这种行为:https://github.com/yekatkov/CustomNewDelete
重现错误的步骤在 Readme.md 中。
这是优化的正常行为吗?或者我应该以不同的方式使用 std::string 吗?如何强制我的库中的 stl 类使用我的 new/delete?假设我真正的图书馆有大量的 stl 类,因此我不能为每个类重新定义分配器。 :(
我使用 glibc 2.27、gcc 5.5.0
很高兴听到任何想法:)
谢谢!
【问题讨论】:
-
new和delete有不同的重载。无法真正知道std::string的实现在幕后做了什么。如果我是你,我真的不会采用这种方法,而是我会实现一个自定义分配器并在容器上使用它。 -
即使this refers to Windows DLL's,这也可以解释您遇到的问题。
标签: c++ gcc stl operator-overloading std