将deque转换为void指针是否安全
Is casting a deque to and from void pointer safe?
文档中说
与vector不同,deque不能保证将其所有元素存储在连续的存储位置
这是否意味着如果我将deque转换为void *,然后返回到原始deque,我可能会在里面得到一些随机数据?
不,这意味着你不能接受deque的第一个元素的地址,将其强制转换为指针,然后在假设其余元素是连续顺序的情况下执行指针算术:
deque<int> d;
//...
int* x = &(d[0]);
int secondElement = x[1]; // illegal
vector<int> v;
//...
int* x = &(v[0]);
int secondElement = x[1]; // legal
您可以将deque的地址强制转换为void*
,然后再将其强制转换回来。
No。不是这个意思。首先,不能将deque
强制转换为void*
。这两个将有不同的大小,这将打破对象。
它的实际意思是你可以这样做:
vector<int> myVec = ...;
int* theBuffer = &myVec[0]; // In C++ 11, you can also do myVec.data() instead
和theBuffer
将是一个连续的内存段,所以你可以把它传递给一个C函数期望一个指针,例如(见下文),使用指针算术访问它,等等。deque
不能这样做,因为它的内部表示不提供这样的保证。注意,这与存储在vector
或deque
中的数据有关,而与对象本身无关。如果您想将指向deque
的指针存储在void*
中,您可以自由地这样做。
// Example: A C function
extern "C" void a_c_function(int* data, const size_t num_elements);
// Invoking it on a vector's elements
a_c_function(&myVec[0], myVec.size());
不能将结构体强制转换为指针。reinterpret_cast
可能会用一些未知的语义编译,但它只是要求打破:deque
将至少有两个指针大,所以它不能装进一个指针。
您可以将deque<…> *
转换为void *
并返回。这与deque的内容无关,但它只是取容器对象本身的地址。
std::deque< int > dq;
void * x = reinterpret_cast< void * >( dq ); // Nonsense.
void * y = static_cast< void * >( & dq ); // Type-erased ptr to object, OK.
std::deque< int > & dqr = * static_cast< std::deque< int > * >( y ); // restore type, OK.
deque
和vector
之间的相关区别在于它们的迭代器:可以像使用vector::iterator
一样使用指向vector
元素的指针,因为vector使用连续存储。然而,在deque
中导航的唯一方法是deque::iterator
。
int * vf = & vec.front(); // Ptr to first element
int * velem = vf + 10; // OK if vec has 10 elements.
int * df = & dq.front(); // Ptr to first element
int * delem = df + 10; // Error, although it might work sometimes.
相关文章:
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 'this'指针是否可以在 c++ 标头声明中使用?
- C++ 在向量中使用指针是否可能导致指针悬空?
- 唯一指针是否在堆或堆栈上分配内存?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何判断指针是否是指向数组的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 如何知道指针是否已在其他地方释放
- 结构成员指针是否自动初始化为零?
- 为静态类创建指向对象的指针是否合法?
- 新的自动关键字指针是否会自行删除?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?