从模板分配void指针

时间:2012-09-26 22:20:11

标签: c++ string templates pointers void

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

你似乎正在做的是制作一个对象的二进制副本,这是一件坏事和坏事的严重案例。在你的第一个案例中,你是这样做的,真实的&#34;对象,所以它似乎可以工作,因为原始对象(str对象)仍然存在,所以复制包含的任何指针仍指向“有效”&#39;数据。在第二种情况下,您正在对一个临时对象进行操作,该对象在事物之后立即被释放,这可能是您复制&#34;复制的原因。只有垃圾。

无论哪种方式,从它的外观来看,两者都没有实际做任何可以重复的事情。我说你的第一个例子似乎才有效。