- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已阅读 DDJ 中有关作用域守卫 ( Generic: Change the Way You Write Exception-Safe Code — Forever ) 的文章,并且了解它们的常见用法。
但是,通常的用途是为特定的操作在栈上实例化一个特定的栈守卫,例如:
{
FILE* topSecret = fopen("cia.txt");
ON_BLOCK_EXIT(std::fclose, topSecret);
... use topSecret ...
} // topSecret automagically closed
但是如果我想在运行时安排清理操作怎么办,例如当我有一个循环时:
{
vector<FILE*> topSecretFiles;
for (int i=0; i<numberOfFiles; ++i)
{
char filename[256];
sprintf(filename, "cia%d.txt", i);
FILE* topSecret = fopen(filename);
topSecretFiles.push_back(topSecret);
ON_BLOCK_EXIT(std::fclose, topSecret); // no good
}
}
显然,上面的例子是行不通的,因为 topSecret
将与 for 作用域一起关闭。我想要一个范围保护模式,我可以在其中轻松地排队我确定需要在运行时的清理操作。有这样的东西吗?
我无法将范围保护对象推送到标准队列中,因为原始对象(我正在推送的对象)会在该过程中被取消。如何插入堆分配的堆栈保护并使用删除其在 dtor 上的成员的队列?有没有人有更聪明的方法?
最佳答案
您似乎并不欣赏 RAII 的本质。这些范围守卫有时对本地(“范围”)事物很好,但您应该尽量避免使用它们,以支持 RAII 真正应该做的事情:将资源封装在一个对象中。 FILE* 类型真的不擅长这个。
这里有一个替代方案:
void foo() {
typedef std::tr1::shared_ptr<FILE> file_sptr;
vector<file_sptr> bar;
for (...) {
file_sptr fsp ( std::fopen(...), std::fclose );
bar.push_back(fsp);
}
}
或者:
void foo() {
typedef std::tr1::shared_ptr<std::fstream> stream_sptr;
vector<stream_sptr> bar;
for (...) {
file_sptr fsp ( new std::fstream(...) );
bar.push_back(fsp);
}
}
或在“C++0x”(即将推出的 C++ 标准)中:
void foo() {
vector<std::fstream> bar;
for (...) {
// streams will become "movable"
bar.push_back( std::fstream(...) );
}
}
编辑:因为我非常喜欢 C++0x 中的可移动类型并且您对它表现出了兴趣:下面是您可以将 unique_ptr 与 FILE* 结合使用的方法没有任何引用计数开销:
struct file_closer {
void operator()(FILE* f) const { if (f) std::fclose(f); }
};
typedef std::unique_ptr<FILE,file_closer> file_handle;
file_handle source() {
file_handle fh ( std::fopen(...) );
return fh;
}
int sink(file_handle fh) {
return std::fgetc( fh.get() );
}
int main() {
return sink( source() );
}
(未经测试)
关于c++ - 动态创建的作用域守卫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565517/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!