RAII char缓冲区

时间:2016-04-29 11:15:06

标签: c++ raii

我想包装几个C函数以保证C ++的安全使用。有一个C函数,它将原始指针带到数组及其大小,如 -

void function(char* bufferToFill, size_t bufsize)

现在,我无法找到可以公开原始指针传递给此类函数的C ++对象。我想避免使用new []并且每次抛出异常时都要记住删除[]。

std :: string显然无法暴露它的char *,std :: vector类似,我唯一想到的就是std :: unique_ptr但它感觉有点奇怪(因为它通常用来拥有一个对象,而不是数组?)

什么是正确的C ++解决此类问题的方法? 提前致谢

2 个答案:

答案 0 :(得分:5)

  

std :: string显然无法公开其char *,std :: vector类似的

当然可以; C ++ 11保证std::string 1 std::vector的存储是连续的,因此您可以&str[0]获取指向底层数据的指针( 编辑:实际上std::vector &str[0]如果str.size()==0不正常,但data()方法保证始终有效。“

指针的有效性取决于通常的引用无效规则(即只要您不执行任何可能的重新分配操作,它就有效。)

转角案例:空容器

虽然在这种情况下空容器不是问题(为什么有人会通过零长度缓冲区来填充?),知道这一点仍然有用:

    对于std::string
  • ,即使字符串为空,也可以安全地询问&str[0];事实上,标准明确说明(在[string.access]):

      

    返回: *(begin() + pos) if pos < size(),否则引用类型为T且价值为charT()的对象;参考值不得修改。

  • 对于std::vector
  • ,如果向量为空,可能无法调用&str[0]; operator[]在序列容器的一般要求中指定,具有操作语义*a.begin(),如果size()为0,则为未定义的行为;但是,C ++ 11确实提供了data()方法,该方法总是返回某种有效指针(尽管在空向量的情况下为空有效范围)

不幸的是,您不能只记得data()对于两个容器都是正确的,因为std::string它会将const指针返回到c_str()

  1. 在所有答案中,我说std::string我实际上是指std::basic_string的任何专业化。

答案 1 :(得分:3)

  

唯一让我想到的是std :: unique_ptr,但感觉有点奇怪(因为它通常用来拥有一个对象,而不是数组?)

这里有另一种误解。

数组是一个对象,the language specifically allows for std::unique_ptr of arrays

std::unique_ptr<int[]> p(new int[10]);