RAII字符缓冲区
RAII char buffer
为了安全使用C++,我想包装一些C函数。有一个C函数,它获取指向数组及其大小的原始指针,如-
void function(char* bufferToFill, size_t bufsize)
现在,我很难找到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]);
std::string显然不能暴露其char*,std::vector类似
他们当然可以;C++11保证std::string
1和std::vector
的存储是连续的,因此您可以执行&str[0]
以获得指向底层数据的指针(edit:实际上,对于std::vector
,如果str.size()==0
,&str[0]
是不可以的,但是data()
方法保证始终工作)。
指针的有效性受通常引用无效规则的约束(即,只要不执行任何潜在的重新分配操作,指针就有效)。
角落案例:空容器
虽然在这种情况下,空容器不是问题(为什么有人会传递零长度的缓冲区来填充?)但知道这一点仍然很有用:
-
对于
std::string
,请求&str[0]
总是安全的,即使字符串为空;事实上,标准明确表示(在[string.access]):返回:如果为
pos < size()
,则返回*(begin() + pos)
,否则返回对值为charT()
的T
类型对象的引用;不得修改参考值。 -
对于
std::vector
,如果向量为空,那么调用&str[0]
可能是不好的;operator[]
是在序列容器的一般要求中指定的,具有操作语义*a.begin()
,如果size()
为0,则为未定义行为;然而,C++11确实提供了data()
方法,它总是返回某种有效指针(尽管在空向量的情况下是空的有效范围)
不幸的是,您不能只记住data()
对于两个容器都是正确的,因为对于std::string
,它返回的const
指针与c_str()
完全一样。
- 在所有的答案中,我说的
std::string
实际上指的是std::basic_string
的任何专业化
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 将字符缓冲区强制转换为函数指针
- 来自无符号字符缓冲区的虚拟输出
- 如何在C++中将无符号字符缓冲区转换为双精度?
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 线程函数无法从堆上分配的缓冲区中读取字符
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 二进制字符数组转换为字符串流并从缓冲区弹出
- 如何通过1024字节缓冲区和强力冲洗在插座连接上发送6个字符的C弦
- 将字符缓冲区转换为字符串
- 读取文件时字符缓冲区溢出
- MessageBox打印来自TCHAR缓冲区的额外Unicode字符
- 我可以做一个循环,直到“std::cin”在输入缓冲区中看到“”字符
- 来自字符缓冲区的恐惧
- Sprintf 缓冲区问题,错误分配给字符数组
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"
- 缓冲区中的垃圾字符
- 动态分配缓冲区(字符字符串)大小 =i;使用马洛克
- ReadFile只读取一个缓冲区字符