Я пытаюсь сделать что-то подобное в моем 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) все еще присутствует, поэтому любой указатель, содержащийся в копии, по-прежнему указывает на «действительные» данные. Во втором случае вы делаете это с временным объектом, который освобождается сразу после вещи, поэтому, вероятно, ваша «копия» содержит только мусор.
В любом случае, судя по всему, ни один из них на самом деле не делает вообще ничего разумного. Я бы сказал, что ваш первый пример только работает.