std :: basic_string模板专门化

时间:2014-10-03 18:19:36

标签: c++ string templates specialization

我尝试使用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;
}

0 个答案:

没有答案