allocate_shared with malloc

时间:2018-02-21 21:36:04

标签: c++ c++11 memory

我正在尝试编写一个程序 C ++但不使用libstdc ++。 我的程序只使用一些标题 模板,它也使用allocate_shared, 我提供自定义分配器 避免运营商新增和删除。

我的问题是我只能得到 摆脱运营商的新潮流。操作员删除 仍在结果中引用 对象文件。

private static final String EMPLOYEE_TABLE = "create table Employess.MyEmployees3 ( "
   + "   id INT PRIMARY KEY, firstName VARCHAR(20), lastName VARCHAR(20), "
   + "   title VARCHAR(20), salary INT )";

让我们编译:

#include <cstdlib> #include <memory> template <class T> struct Mallocator { typedef T value_type; Mallocator() = default; template <class U> constexpr Mallocator(const Mallocator<U>&) noexcept {} T* allocate(std::size_t n) { return (T*)std::malloc(n*sizeof(T)); } void deallocate(T* p, std::size_t) noexcept { std::free(p); } }; template <class T, class U> bool operator==(const Mallocator<T>&, const Mallocator<U>&) { return true; } template <class T, class U> bool operator!=(const Mallocator<T>&, const Mallocator<U>&) { return false; } struct A { std::shared_ptr<int> a; A(const std::shared_ptr<int> b) : a(b) {} }; int main() { A a(std::allocate_shared<int>(Mallocator<int>(), 5)); return 0; }

看看那里有什么:

$ c++ -c malloca.cpp

操作员删除仍然存在,尽管如此 提供自定义分配器。怎么样 我可以摆脱它吗?

1 个答案:

答案 0 :(得分:3)

我相信,operator delete的呼吁存在GCC STL实施的特殊性。

查看shared_ptr_base.h的(相当复杂的)代码,我可以看到_Sp_counted_base将从delete函数调用_M_destroy。此函数在_Sp_counted_ptr_inplace(最终与allocate_shared一起使用的那个)中被覆盖,因此永远不会执行此代码。但它的存在提供了未解决的符号。

覆盖全局operator delete摆脱它。