你能删除从fopen创建的FILE对象吗?

时间:2014-09-08 23:17:31

标签: c++ fopen

在调查崩溃时,我遇到了这段代码:

FILE * RejectFile = fopen("filename", "a+");
// other code happens
delete RejectFile;

我的理解是,您只能在delete创建的对象上调用new。虽然这些旧代码中的一些非常糟糕,但这可能是错误的,但我不确定。这是有效的代码吗?

2 个答案:

答案 0 :(得分:14)

不,这是无效的。只对通过delete获得的指针使用new。这里发生的是未定义的行为;它可能会工作,它可能会崩溃,它可能会输出垃圾,它可能会开始播放一些音乐......

您需要使用fclose()来销毁文件句柄。

答案 1 :(得分:4)

如果你真的需要使用delete,你可以在这些结构周围使用一些包装器。像,

class MyFILE
{
public:
    MyFILE(/*file params*/);
    virtual ~MyFILE(){fclose(_fileptr);
private:
    FILE * _fileptr;
}

示例用法是,

MyFILE * f = new MyFILE(/*file params*/);
delete f;

就个人而言,我更喜欢这种包装解决方案,因为它提供了一种管理资源的综合方法。例如,当我们在代码段上时,任何时候都可以抛出异常。如果我们已经分配了像打开文件这样的资源,这种机制就会开辟出自动化的方式。当包装器将其从范围中移出时删除该对象。