为什么我不能将unique_ptr与fread一起使用?

时间:2014-11-05 19:05:26

标签: c++ c++14 unique-ptr

如果您运行下面的代码,fread将返回0.如果您将p更改为使用buf而不是unique_ptr,则会有效。为什么?我在MSVC 2013中运行了这个

#include <iostream>
#include <map>
#include <memory>
using namespace std;

int main(int argc, char *argv[]) {
    char buf[1024 * 32];
    auto buf2 = make_unique<char>(1024 * 32);

    {
        memset(buf, 0, sizeof buf);
        FILE *f = fopen("tmpfile", "wb");
        printf("write = %d\n", fwrite(buf, 1, sizeof buf, f));
        fclose(f);
    }

    //char*p = 0 ? buf2.get() : buf;
    //char*p = buf;
    char*p = buf2.get();

    FILE *f = fopen("tmpfile", "r+b");

    printf("read = %d\n", fread(p, 1, sizeof buf, f));

    fclose(f);
    return 0;
}

1 个答案:

答案 0 :(得分:6)

auto buf2 = make_unique<char>(1024 * 32);

分配一个char并将其初始化为(1024 * 32) mod 256(假设为8位字符)。要分配包含这些元素的char数组,请使用

auto buf2 = unique_ptr<char[]>(new char[1024 * 32]);
//or
auto buf2 = make_unique<char[]>(1024 * 32);

进行更改后,您的程序应该按预期运行。

Live demo


您也可以使用unique_ptr来管理FILE

定义删除器和别名

auto fcloser = [](FILE *f) { ::fclose(f); };
using unique_file = std::unique_ptr<FILE, decltype(fcloser)>;

然后将其用作

unique_file f(fopen("tmpfile", "wb"), fcloser); // use f.get() to access FILE*

您甚至可以定义工厂功能以减少冗长。