从模板分配无效指针

Allocating void pointer from a template

本文关键字:无效 指针 分配      更新时间:2023-10-16

我正在尝试在我的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 时,您可能无法正确初始化新对象。例如,如果它的成员是指针。对于字符串,其实现可能包含指向原始字符串拥有的字符缓冲区的指针。当原始字符串被删除时,字符缓冲区也会被删除。但是您的内存复制对象仍将指向已删除的缓冲区。

嗯,很难猜到你想做什么。

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

不管怎样,从表面上看,两人实际上都没有做任何可理睬的事情。我会说你的第一个例子似乎只有效。