以二进制形式从ifstream创建unique_ptr

时间:2014-11-15 21:15:06

标签: c++ fstream ifstream unique-ptr

我希望使用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,但我认为它完全代表了我的存储结构。

1 个答案:

答案 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