0

我正在尝试在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);
}

任何的想法?

4

2 回答 2

2

正如其他人所评论的那样,您不应该做这样的事情。您提供的代码示例不适用于非 POD 的任何内容(http://stackoverflow.com/questions/146452/what-are-pod-types-in-c)。当您执行 memcpy 时,您可能没有正确初始化新对象。例如,如果它的成员是指针。在字符串的情况下,它的实现可能包含一个指向原始字符串所拥有的字符缓冲区的指针。当原始字符串被删除时,字符缓冲区也会被删除。但是您的 memcopied 对象仍将指向已删除的缓冲区。

于 2012-09-26T23:02:20.817 回答
1

好吧,很难猜出你想要做什么。

您似乎在做的是制作对象的二进制副本,这是所有坏事和邪恶的严重案例。在您的第一种情况下,您正在对“真实”对象执行此操作,因此由于原始对象(str 对象)仍然存在,因此它可能看起来有效,因此副本包含的任何指针仍然指向“有效”数据。在第二种情况下,您正在对一个临时对象执行此操作,该对象在事情发生后立即被释放,这可能就是您的“副本”只有垃圾的原因。

不管怎样,从表面上看,两者实际上都没有做任何合理的事情。我想说你的第一个例子似乎只起作用。

于 2012-09-26T23:01:15.630 回答