我正在尝试编写一个程序 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
操作员删除仍然存在,尽管如此 提供自定义分配器。怎么样 我可以摆脱它吗?
答案 0 :(得分:3)
我相信,operator delete
的呼吁存在GCC STL实施的特殊性。
查看shared_ptr_base.h
的(相当复杂的)代码,我可以看到_Sp_counted_base
将从delete
函数调用_M_destroy
。此函数在_Sp_counted_ptr_inplace
(最终与allocate_shared
一起使用的那个)中被覆盖,因此永远不会执行此代码。但它的存在提供了未解决的符号。
覆盖全局operator delete
摆脱它。