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


任何想法?

最佳答案

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

关于c++ - 从模板分配空指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12611332/

10-11 04:25