在共享库中使用过载的newdelete和STL。

问题描述 投票:0回答:1

我遇到了一个问题,这个问题是由过载操作符的组合引起的。新删除STL (尤其是std::string)。我的情况是这样的...

我编译了共享库(称它为libfoo.so),在其中我重载了操作符。新的删去. 为了不影响将使用这个库的程序,我做了符号。新的删去 hidden.此外,我的库使用STL,特别是std::string,正如我所期望的那样,它应该使用我的操作符。新删除 因为它是模板类。

当我用-O1及以上版本编译库时,我得到了SIGABRT,这是由于使用了不同的操作符造成的。新删除 在basic_string构造ordestructor中。新的 在libstdc++.so中被调用,但是 删去 从我的库中调用。

当我在编译库时使用-O0或-fno-inline操作符时 新删除 basic_string的constructordestructor都是由libstdc++调用的。

我做了一个最小的例子来展示这种行为。https:/github.comyekatkovCustomNewDelete 重现错误的步骤在Readme.md中。

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

我使用的是glibc 2.27, gcc 5.5.0。

很高兴听到任何想法:)

谢谢你

c++ gcc stl operator-overloading std
1个回答
2
投票

你的基本问题是,你试图拥有多个不同的全局的 operator new中,一个在你的 dylib 中,另一个给使用你的 dylib 的其他人。

只能有一个. 这就是为什么它被称为 全球性 操作员。

如果你有多个,你可以得到你所看到的行为。(或者其他的东西,你正走入UB-land这里)

(后面)libstdc++和libc++都在外部实例化了 std::basic_string<char, std::char_traits<char>, std::allocator<char>> (又名 std::string)。这意味着,当你在 string你在dylib中运行的代码,不会使用隐藏的操作符newdelete来分配空闲的内存。

© www.soinside.com 2019 - 2024. All rights reserved.