我想包装几个C函数以保证C++的安全使用.有一个C函数,它接受指向数组的原始指针及其大小,如 -
void function(char* bufferToFill, size_t bufsize)
Run Code Online (Sandbox Code Playgroud)
现在,我无法找到可以公开原始指针传递给这种函数的C++对象.我想避免使用new []并且每次抛出异常时都要记住删除[]它.
std :: string显然无法暴露它的char*,std :: vector类似,我脑海中唯一想到的是std :: unique_ptr,但它感觉有点奇怪(因为它通常用于拥有一个对象,而不是数组?)
什么是正确的C++方法来解决这样的问题?提前致谢
我唯一想到的是 std::unique_ptr 但感觉有点奇怪(因为它通常用于拥有一个对象,而不是数组?)
这里的另一个误解。
数组是一个对象,该语言特别允许std::unique_ptr数组:
std::unique_ptr<int[]> p(new int[10]);
Run Code Online (Sandbox Code Playgroud)
std :: string显然不能公开它的char*,std :: vector类似
他们当然可以; C++ 11保证std::string1和1的存储std::vector是连续的,所以你可以做到&str[0]获取指向底层数据的指针(编辑:实际上std::vector &str[0]如果不是这样str.size()==0,那么data()方法可以保证始终有效).
指针的有效性取决于通常的引用无效规则(即只要您不执行任何可能的重新分配操作,它就是有效的).
虽然在这种情况下空容器不是问题(为什么有人会通过零长度缓冲区来填充?),知道这一点仍然很有用:
因为std::string,&str[0]即使字符串是空的,也总是安全的要求; 事实上,标准明确说明(在[string.access]):
返回:
*(begin() + pos)ifpos < size(),否则引用T具有值的类型的对象charT(); 参考值不得修改.
因为std::vector,&str[0]如果向量为空,可能无法调用; operator[]在序列容器的一般要求中指定,具有操作语义*a.begin(),如果size()为0 ,则为未定义的行为; 但是,C++ 11确实提供了data()方法,它总是返回某种有效指针(尽管在空向量的情况下为空有效范围)
不幸的是,你不能只记得data()两个容器都是正确的,因为std::string它返回一个const完全相同的指针c_str().
std::string我实际上是指任何专业化std::basic_string.