从模板分配无效指针
Allocating void pointer from a template
我正在尝试在我的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 对象)仍然存在,因此副本包含的任何指针仍然指向"有效"数据。在第二种情况下,你对一个临时对象执行此操作,该对象在事情之后立即被释放,这可能就是为什么你的"副本"只有垃圾的原因。
不管怎样,从表面上看,两人实际上都没有做任何可理睬的事情。我会说你的第一个例子似乎只有效。
相关文章:
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性