如何在给定地址放置T *的副本?

时间:2011-11-23 00:01:09

标签: c++

考虑类型T和指向TT*的指针。

有没有办法在给定地址T*下放置x的副本,而不是使用memcpy()并以便携方式?

编辑:

为了清楚起见,我不想在地址T处构建x。我想将指针的值复制到地址T的{​​{1}},T*,如

x

5 个答案:

答案 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替换为您的类型(UU*等。)

答案 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)

我以前从未使用它,但看起来“放置新”可能对解决您的问题很有帮助。

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

答案 3 :(得分:0)

T *& newVal = new (x) T**(oldVal);

答案 4 :(得分:0)

void* X;
typeT* T;

X=x;
* (typeT*) X = *T;

这应该是便携式的。 但请注意,在执行复制(=)操作之前必须适当分配足够的空间。