在析构函数中调用 remove() 删除文件是否安全?
Is it safe to call remove() to delete files in destructor?
我有一个 class 可以在调用某些成员函数时创建一些临时文件。我希望在 class 超出范围(通常或由于异常)时删除这些文件,所以我想在析构函数中删除它们:
#include <cstdio>
#include <string>
class MyClass
{
//implementation details
//Names of temp files
std::string tempFile1, tempFile2,tempFile3;
~MyClass()
{
remove(tempFile1.c_str());
remove(tempFile2.c_str());
remove(tempFile3.c_str());
}
};
问题是如果析构函数因为异常被调用,那么很可能不是所有的3个临时文件都被创建。根据 cpluscplus.com,在这种情况下,remove()
函数将 return 一个非零值并向 stderr 写入一些内容。但是因为是C函数,所以不会有异常。
我知道析构函数不应该抛出。像这样的错误怎么办?是否推荐写这样的析构函数?
C 库函数 remove
和 C++ 析构函数之间没有交互。
除非
你正在编写一个 C 库,并在 C++ 中执行,上面的 MyClass
是实现的一部分,因此调用 remove
会触发一些错误的重新 -入口什么的。)
您在调用 C 库期间关闭的信号处理程序中执行此操作,在这种情况下,C++ 析构函数方面没有实际意义。您不能从信号处理程序调用 remove
。
您正在抛出跨 C 库激活框架的异常。那可能很糟糕。
remove
函数肯定不会打印任何内容,即使它失败了。您误解了 cplusplus.com 参考文本。它指的是它的代码示例,而不是函数。代码示例是打印消息的内容。
您所展示的内容可以正常工作。但我通常更喜欢更 RAII 的方法,例如:
#include <cstdio>
#include <string>
struct RemovableFile
{
std::string fileName;
bool canRemove;
RemovableFile() : canRemove(false) {}
~RemovableFile(){ if (canRemove) remove(fileName.c_str()); }
};
class MyClass
{
...
//Names of temp files
RemovableFile tempFile1, tempFile2, tempFile3;
...
};
void MyClass::doSomething()
{
...
tempFile1.fileName = ...;
...
if (file was created)
tempFile1.canRemove = true;
...
};
或者更像这样:
#include <cstdio>
#include <string>
#include <fstream>
struct RemovableFile
{
std::string fileName;
std::fstream file;
~RemovableFile() { if (file.is_open()) { file.close(); remove(fileName.c_str()); } }
void createFile(const std::string &aFileName)
{
file.open(aFileName.c_str(), ...);
fileName = aFileName;
}
};
class MyClass
{
...
//Names of temp files
RemovableFile tempFile1, tempFile2, tempFile3;
...
};
void MyClass::doSomething()
{
...
tempFile1.createFile(...);
...
};
我有一个 class 可以在调用某些成员函数时创建一些临时文件。我希望在 class 超出范围(通常或由于异常)时删除这些文件,所以我想在析构函数中删除它们:
#include <cstdio>
#include <string>
class MyClass
{
//implementation details
//Names of temp files
std::string tempFile1, tempFile2,tempFile3;
~MyClass()
{
remove(tempFile1.c_str());
remove(tempFile2.c_str());
remove(tempFile3.c_str());
}
};
问题是如果析构函数因为异常被调用,那么很可能不是所有的3个临时文件都被创建。根据 cpluscplus.com,在这种情况下,remove()
函数将 return 一个非零值并向 stderr 写入一些内容。但是因为是C函数,所以不会有异常。
我知道析构函数不应该抛出。像这样的错误怎么办?是否推荐写这样的析构函数?
C 库函数 remove
和 C++ 析构函数之间没有交互。
除非
你正在编写一个 C 库,并在 C++ 中执行,上面的
MyClass
是实现的一部分,因此调用remove
会触发一些错误的重新 -入口什么的。)您在调用 C 库期间关闭的信号处理程序中执行此操作,在这种情况下,C++ 析构函数方面没有实际意义。您不能从信号处理程序调用
remove
。您正在抛出跨 C 库激活框架的异常。那可能很糟糕。
remove
函数肯定不会打印任何内容,即使它失败了。您误解了 cplusplus.com 参考文本。它指的是它的代码示例,而不是函数。代码示例是打印消息的内容。
您所展示的内容可以正常工作。但我通常更喜欢更 RAII 的方法,例如:
#include <cstdio>
#include <string>
struct RemovableFile
{
std::string fileName;
bool canRemove;
RemovableFile() : canRemove(false) {}
~RemovableFile(){ if (canRemove) remove(fileName.c_str()); }
};
class MyClass
{
...
//Names of temp files
RemovableFile tempFile1, tempFile2, tempFile3;
...
};
void MyClass::doSomething()
{
...
tempFile1.fileName = ...;
...
if (file was created)
tempFile1.canRemove = true;
...
};
或者更像这样:
#include <cstdio>
#include <string>
#include <fstream>
struct RemovableFile
{
std::string fileName;
std::fstream file;
~RemovableFile() { if (file.is_open()) { file.close(); remove(fileName.c_str()); } }
void createFile(const std::string &aFileName)
{
file.open(aFileName.c_str(), ...);
fileName = aFileName;
}
};
class MyClass
{
...
//Names of temp files
RemovableFile tempFile1, tempFile2, tempFile3;
...
};
void MyClass::doSomething()
{
...
tempFile1.createFile(...);
...
};