我尝试使用std :: basic_string<>创建自己的字符串类使用自定义分配器。它似乎主要是在工作,这在很大程度上要归功于stackoverflow上的其他相关主题。但我真的希望这可以替代std :: string。为此,它需要分配给std:string或从std:string分配。我试过重载赋值运算符等等,但我似乎无法正常工作。
这里的最终目标是通过替换std :: string来记录/跟踪现有代码中字符串的内存分配。如果有更好的方法,我也希望听到它。
这是一个嵌入式应用程序,因此我对第三方工具的选择有限。
这是一个示例应用,其中包含我已经拥有的代码。
戴夫
#include <iostream>
using namespace std;
namespace mw_allocator_namespace
{
int mw_allocator_space =0;
template <typename T>
class mw_allocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1>
struct rebind
{
typedef mw_allocator<_Tp1> other;
};
pointer allocate(size_type n, const void *hint=0)
{
pointer p = std::allocator<T>::allocate(n, hint);
mw_allocator_space += n*sizeof(T);
cout << hex << " Alloc: " << n << " : " << n*sizeof(T) << " (" << reinterpret_cast<unsigned long long>(p) << ")" << endl;
return p;
}
void deallocate(pointer p, size_type n)
{
cout << hex << " Dealloc: " << n << " : " << n*sizeof(T) << " (" << reinterpret_cast<unsigned long long>(p) << ")" << endl;
mw_allocator_space -= n*sizeof(T);
std::allocator<T>::deallocate(p, n);
}
mw_allocator() throw(): std::allocator<T>() { cout << " Hello allocator!" << endl; }
mw_allocator(const mw_allocator &a) throw(): std::allocator<T>(a) { }
template <class U>
mw_allocator(const mw_allocator<U> &a) throw(): std::allocator<T>(a) { }
~mw_allocator() throw() { }
};
}
typedef std::basic_string<char, std::char_traits<char>, mw_allocator_namespace::mw_allocator<char> > my_string;
int main() {
string s1("Hello World1");
my_string ms1;
#if 0
// This doesn't work
ms1 = s1;
#else
// This does...
ms1 = s1.c_str();
#endif
cout << "ms1: " << ms1 << endl;
return 0;
}