a的控制块shared_ptr保持活动,同时存在至少一个weak_ptr存在.如果创建共享指针make_shared,则意味着保持分配对象的整个内存.(对象本身被正确销毁,但由于控件块和对象的内存分配在一个块make_shared中,因此它们只能一起解除分配.)
我的理解是否正确?
看起来这种行为代表了一个问题,例如在着名的"缓存示例"中.对象的内存将永远分配.
这在任何实际情况下都是一个问题吗?应该shared_ptr在这种情况下使用构造函数创建(大对象和意图使用weak_ptrs)?
在我的系统(Ubuntu Linux,glibc)上,close调用的手册页指定了它可以返回的几个错误返回值.它还说
不检查close()的返回值是一个常见但严重的编程错误.
同时
请注意,返回值仅应用于诊断.特别是在EINTR之后不应该重试close(),因为这可能导致另一个线程的重用描述符被关闭.
所以我不允许忽略返回值,也不允许重试调用.
鉴于此,我该如何处理close()呼叫失败?
如果在我向文件写入内容时发生错误,我可能应该尝试在其他地方写入信息以避免数据丢失.
如果我只是在阅读文件,我可以记录失败并继续假装没有发生的程序吗?是否有任何警告,文件描述符泄漏或其他什么?
我想将一系列对象移动到未初始化的内存中(使用move-construction).由于没有移动,对口std::uninitialized_copy,我想出了两种选择:要么使用std::move与raw_storage_iterator,或求助于人工循环:
T* dest = get_memory();
// option one
std::move(first, last, std::raw_storage_iterator<T*, T>(dest));
// option two
for (auto i=first; i != last; ++i, ++dest)
{
new(dest) T(std::move(*i));
}
Run Code Online (Sandbox Code Playgroud)
第一个选项是移动构造(因此等同于第二个),还是复制构造,或默认构造,然后是移动分配?是否还有其他考虑因素需要一个或另一个选项?