我正在做一些维护工作,遇到类似以下的事情:
std::string s;
s.resize( strLength );
// strLength is a size_t with the length of a C string in it.
memcpy( &s[0], str, strLength );
Run Code Online (Sandbox Code Playgroud)
我知道使用&s [0]如果它是std :: vector会是安全的,但是这是std :: string的安全使用吗?
我在一些C++中为嵌入式系统包装用户空间linux套接字功能(是的,这可能会再次重新发明轮子).
我想使用向量提供读写实现.
写入非常简单,我可以通过&myvec[0]并避免不必要的复制.我想做同样的事情并直接读入一个向量,而不是读入一个char缓冲区,然后将所有这些复制到一个新创建的向量中.
现在,我知道我想读多少数据,我可以适当地分配(vec.reserve()).我也可以读到&myvec[0],虽然这可能是一个非常糟糕的想法.显然这样做不允许myvec.size返回任何合理的东西.有没有办法做到这一点:
char *样式缓冲区到C++向量.这是相当牵强的,但以下代码是"安全的"(即保证不会导致分段错误):
std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
Run Code Online (Sandbox Code Playgroud)
我意识到这很难看 - 我只想知道它是否技术上安全,而不是"漂亮".我猜它唯一的用法可能是忽略存储在给定索引之外的值.
注意!如何获取vector :: reserve()分配的缓冲区地址?涵盖相同的主题,但我更感兴趣的是,如果这是安全的,如果有这样的陷阱.
编辑:原代码是错误的,取代原来memcpy用memset.
正如我们所知, std::vector 在初始化时像std::vector vect(n)orempty_vect.resize(n)不仅分配所需的内存量,而且还用默认值初始化它(即调用默认构造函数)。这会导致不必要的初始化,特别是如果我有一个整数数组并且我想用一些无法通过任何向量构造函数提供的特定值填充它。
另一方面,Capacity 在 call like 中分配内存empty_vect.reserve(n),但在这种情况下 vector 仍然是空的。所以size()返回0,empty()返回true,operator[]产生异常。
现在,请查看代码:
{ // My scope starts here...
std::vector<int> vect;
vect.reserve(n);
int *data = vect.data();
// Here I know the size 'n' and I also have data pointer so I can use it as a regular array.
// ...
} // Here ends my scope, so vector is destroyed, memory is released.
Run Code Online (Sandbox Code Playgroud)
问题是“所以我可以将它用作数组”是否是一个安全的假设?
无论争论,我只是对上述问题感到好奇。无论如何,至于论据: …