我正在尝试在我的Obj
课程中执行类似的操作:
public:
template <typename T>
Obj(T & o) {
siz = sizeof(o);
p = malloc(siz);
memcpy(p, &o, siz);
}
private:
void * p;
size_t siz;
如果我做这样的事情,那就行得很好:
string str = "foobar";
Obj u = Obj(str);
但如果我这样做的话就不行了:
Obj u = Obj(string("foobar"));
这会导致字符串填充随机字符。
要检索我使用的字符串:
string S() {
return *((string *)p);
}
有什么想法吗?
答案 0 :(得分:2)
正如其他人所评论的那样,你不应该做这样的事情。您提供的代码示例不适用于非POD的任何内容(http://stackoverflow.com/questions/146452/what-are-pod-types-in-c)。执行memcpy时,可能无法正确初始化新对象。例如。如果它有成员指针。在字符串的情况下,它的实现可能包含指向原始字符串所拥有的字符缓冲区的指针。当原始字符串被删除时,字符缓冲区也将被删除。但是你的memcopied对象仍将指向已删除的缓冲区。
答案 1 :(得分:1)
嗯,很难猜出你想要做什么。
你似乎正在做的是制作一个对象的二进制副本,这是一件坏事和坏事的严重案例。在你的第一个案例中,你是这样做的,真实的&#34;对象,所以它似乎可以工作,因为原始对象(str对象)仍然存在,所以复制包含的任何指针仍指向“有效”&#39;数据。在第二种情况下,您正在对一个临时对象进行操作,该对象在事物之后立即被释放,这可能是您复制&#34;复制的原因。只有垃圾。
无论哪种方式,从它的外观来看,两者都没有实际做任何可以重复的事情。我说你的第一个例子似乎才有效。