std :: string如何做一个像std :: string(char * allocated_outside)这样的构造函数

时间:2015-03-05 08:28:05

标签: c++ string oracle c++11

我正在使用Oracle Occi批量接口,其中oracle可以将大量的字符串数据加载到char *的缓冲区中。假如字符串是20个字节且记录大小是100,那么缓冲区是char [21 * 100],其中一个字符\ 0标记每个字符串记录的结尾。

现在我的问题是,我想保存此缓冲区,以便以后批量插入,删除或更新到oracle。同时我仍然希望使用std :: string来操作记录,比如更改字符串的值并希望同时更改底层char *。

所以问题是,如何为字符串构造函数如std :: string(char * please_dont_care),并确保字符串在销毁时不释放char *?

更多细节。我的出发点是我从Oracle获得的char []。而且我不想将其复制到字符串,因为在我这样做的情况下它可以是2.88亿次操作。我认为复制内存需要一段时间。然后另一个调用函数由其他人编写,它只接受字符串,并将改变字符串的内容。而且我不想做另外2.88亿次操作再次将字符串复制到char *然后将其保存回oracle。

我知道字符串只有字符串(const char *)作为构造函数。我正在研究字符串构造函数,也许我可以修改它并创建一个字符串(char *)构造函数并为字符串设置内部标志,以便在销毁时清除内存?

谢谢。

我试过以下: 在basic_string类中添加了_is_shared私有bool变量。 基于这个basic_string构造函数,

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>::
    basic_string(const _CharT* __s, const _Alloc& __a)
    : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
                   __s + npos, __a), __a)
    { }

我添加了一个新的构造函数,如下所示,跳过复制函数

     basic_string(_CharT* __s, size_type __n, bool shared, const _Alloc& __a = _Alloc())
:_M_dataplus(__s, __a)


    {
        _is_shared=shared;
      }

我更改了析构函数以添加对_is_shared的判断:

  ~basic_string() _GLIBCXX_NOEXCEPT
  {
      if(!_is_shared)
      _M_rep()->_M_dispose(this->get_allocator()); }

但是当我尝试编译时,我收到如下错误: 未定义引用`std :: basic_string,std :: allocator&gt; :: basic_string(char *,unsigned long,bool,std :: allocator const&amp;)&#39;

我将构造函数从.tcc(源文件)移动到.h文件,但它没有帮助。 想知道如何编译它?也许字符串类是C ++内部的,所以我需要做一些额外的工作才能使它工作?

谢谢。

0 个答案:

没有答案