如果您运行下面的代码,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;
}
答案 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);
进行更改后,您的程序应该按预期运行。
您也可以使用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*
您甚至可以定义工厂功能以减少冗长。