在调查崩溃时,我遇到了这段代码:
FILE * RejectFile = fopen("filename", "a+");
// other code happens
delete RejectFile;
我的理解是,您只能在delete
创建的对象上调用new
。虽然这些旧代码中的一些非常糟糕,但这可能是错误的,但我不确定。这是有效的代码吗?
答案 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;
就个人而言,我更喜欢这种包装解决方案,因为它提供了一种管理资源的综合方法。例如,当我们在代码段上时,任何时候都可以抛出异常。如果我们已经分配了像打开文件这样的资源,这种机制就会开辟出自动化的方式。当包装器将其从范围中移出时删除该对象。