考虑类型T
和指向T
,T*
的指针。
有没有办法在给定地址T*
下放置x
的副本,而不是使用memcpy()
并以便携方式?
编辑:
为了清楚起见,我不想在地址T
处构建x
。我想将指针的值复制到地址T
的{{1}},T*
,如
x
答案 0 :(得分:3)
如果您想构建特定地址的对象,请使用placement-new:
#include <new>
T oldT = /* .. */;
T* newT = new (x) T(oldT); // copy-constructed at address x
它就像new T()
,除了你指定缓冲区。 (所以要注意它是一致的,并且足够长。)
如果要复制指针指向的值,只需取消引用指针:
T* x = /* .. */;
T copyT = *x; // dereference x, make copy
在这两种情况下,请将T
替换为您的类型(U
或U*
等。)
答案 1 :(得分:2)
我认为你所要求的就是:
void **address = ...; // address points to a location which can store a void*
T *t = ...;
// note T* and void* are the same size
// now any of these three should work:
static_cast<T*&>(*address) = t;
*reinterpret_cast<T**>(address) = t;
void *t_addr = t;
*address = t_addr;
答案 2 :(得分:0)
我以前从未使用它,但看起来“放置新”可能对解决您的问题很有帮助。
答案 3 :(得分:0)
T *& newVal = new (x) T**(oldVal);
答案 4 :(得分:0)
void* X;
typeT* T;
X=x;
* (typeT*) X = *T;
这应该是便携式的。 但请注意,在执行复制(=)操作之前必须适当分配足够的空间。