我希望使用ifstream加载保存在二进制文件中的对象。目前,指针未初始化,应用程序崩溃。我不是100%确定如何使用unique_ptr执行此操作。我想我必须在读取值之前释放旧对象。
在我的主要构造函数中:
typedef unique_ptr<Character> charPTR;
myCharacter_ = charPTR(new Character());
我尝试加载它:
ifs.read(reinterpret_cast<char*>(&myCharacter_), sizeof(myCharacter_));
保存对象实际上有效:
ofs.write(reinterpret_cast<const char*>(&myCharacter_), sizeof(myCharacter_));
感谢您的帮助,我并不习惯unique_ptr,但我认为它完全代表了我的存储结构。
答案 0 :(得分:0)
Jonathan Potter已经给你一个解决方案,但我会告诉你为什么它有效以及为什么它没有。
当你写出来时:
ofs.write(reinterpret_cast<const char*>(&myCharacter_), sizeof(myCharacter_));
您正在使用myCharacter
的{{1}}地址,并将该指针投射到std::unique_ptr
,而实际上该对象是包含指针。所以你所拥有的基本上等同于const char *
并且你将它投射到const char **
。
通过调用const char *
,您正在检索存储的myCharacter.get()
类型的原始指针(我假设您已确定内存布局与Character *
相同)并将其投射到char *
。
现在const char *
有一个重载,需要ofstream
并假设它是一个以空字符结尾的字符串并尝试将其写出来。你的不是一个空终止的字符串,但通过传递const char *
(我假设它等同于sizeof(Character)
),你保证它只会尝试访问一个字符。您可以通过执行sizeof(char)
并序列化值类型来使其更明确。
更一般地说,如果*myCharacter.get()
真的只是一个Character
那么我就没有看到任何一点char
。复制unique_ptr
的成本总是小于取消引用该指针,实际上指针本身的大小总是远远大于char
。