我想包装几个C函数以保证C ++的安全使用。有一个C函数,它将原始指针带到数组及其大小,如 -
void function(char* bufferToFill, size_t bufsize)
现在,我无法找到可以公开原始指针传递给此类函数的C ++对象。我想避免使用new []并且每次抛出异常时都要记住删除[]。
std :: string显然无法暴露它的char *,std :: vector类似,我唯一想到的就是std :: unique_ptr但它感觉有点奇怪(因为它通常用来拥有一个对象,而不是数组?)
什么是正确的C ++解决此类问题的方法? 提前致谢
答案 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)
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
的任何专业化。答案 1 :(得分:3)
唯一让我想到的是std :: unique_ptr,但感觉有点奇怪(因为它通常用来拥有一个对象,而不是数组?)
这里有另一种误解。
数组是一个对象,the language specifically allows for std::unique_ptr
of arrays:
std::unique_ptr<int[]> p(new int[10]);