相关疑难解决方法(0)

"&s [0]"是否指向std :: string中的连续字符?

我正在做一些维护工作,遇到类似以下的事情:

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++ stdstring memcpy c++03

37
推荐指数
3
解决办法
1万
查看次数

将read()直接用于C++ std:vector

我在一些C++中为嵌入式系统包装用户空间linux套接字功能(是的,这可能会再次重新发明轮子).

我想使用向量提供读写实现.

写入非常简单,我可以通过&myvec[0]并避免不必要的复制.我想做同样的事情并直接读入一个向量,而不是读入一个char缓冲区,然后将所有这些复制到一个新创建的向量中.

现在,我知道我想读多少数据,我可以适当地分配(vec.reserve()).我也可以读到&myvec[0],虽然这可能是一个非常糟糕的想法.显然这样做不允许myvec.size返回任何合理的东西.有没有办法做到这一点:

  1. 从安全/ C++的角度来看,并不完全令人讨厌
  2. 不涉及数据块的两个副本 - 一次从内核到用户空间,一次从C char *样式缓冲区到C++向量.

c++ sockets buffer vector

17
推荐指数
1
解决办法
5003
查看次数

在std :: vector :: reserve safe之后访问原始指针?

这是相当牵强的,但以下代码是"安全的"(即保证不会导致分段错误):

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()分配的缓冲区地址?涵盖相同的主题,但我更感兴趣的是,如果这是安全的,如果有这样的陷阱.

编辑:原代码是错误的,取代原来memcpymemset.

c++ stl vector

6
推荐指数
1
解决办法
1645
查看次数

Reserve() - data() 空向量技巧 - 正确吗?

正如我们所知, std::vector 在初始化时像std::vector vect(n)orempty_vect.resize(n)不仅分配所需的内存量,而且还用默认值初始化它(即调用默认构造函数)。这会导致不必要的初始化,特别是如果我有一个整数数组并且我想用一些无法通过任何向量构造函数提供的特定值填充它。

另一方面,Capacity 在 call like 中分配内存empty_vect.reserve(n),但在这种情况下 vector 仍然是空的。所以size()返回0empty()返回trueoperator[]产生异常。

现在,请查看代码:

{ // 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)

问题是“所以我可以将它用作数组”是否是一个安全的假设?

无论争论,我只是对上述问题感到好奇。无论如何,至于论据: …

c++ stl c++11

3
推荐指数
1
解决办法
159
查看次数

标签 统计

c++ ×4

stl ×2

vector ×2

buffer ×1

c++03 ×1

c++11 ×1

memcpy ×1

sockets ×1

stdstring ×1