小编Ily*_*pov的帖子

weak_ptr,make_shared和内存释放

a的控制块shared_ptr保持活动,同时存在至少一个weak_ptr存在.如果创建共享指针make_shared,则意味着保持分配对象的整个内存.(对象本身被正确销毁,但由于控件块和对象的内存分配在一个块make_shared中,因此它们只能一起解除分配.)

我的理解是否正确?

看起来这种行为代表了一个问题,例如在着名的"缓存示例"中.对象的内存将永远分配.

这在任何实际情况下都是一个问题吗?应该shared_ptr在这种情况下使用构造函数创建(大对象和意图使用weak_ptrs)?

c++ shared-ptr weak-ptr make-shared c++11

18
推荐指数
1
解决办法
1685
查看次数

posix关闭呼叫失败怎么办?

在我的系统(Ubuntu Linux,glibc)上,close调用的手册页指定了它可以返回的几个错误返回值.它还说

不检查close()的返回值是一个常见但严重的编程错误.

同时

请注意,返回值仅应用于诊断.特别是在EINTR之后不应该重试close(),因为这可能导致另一个线程的重用描述符被关闭.

所以我不允许忽略返回值,也不允许重试调用.

鉴于此,我该如何处理close()呼叫失败?

如果在我向文件写入内容时发生错误,我可能应该尝试在其他地方写入信息以避免数据丢失.

如果我只是在阅读文件,我可以记录失败并继续假装没有发生的程序吗?是否有任何警告,文件描述符泄漏或其他什么?

c unix linux error-handling posix

18
推荐指数
1
解决办法
1万
查看次数

移动到未初始化的内存,或raw_storage_iterator的工作原理

我想将一系列对象移动到未初始化的内存中(使用move-construction).由于没有移动,对口std::uninitialized_copy,我想出了两种选择:要么使用std::moveraw_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)

第一个选项是移动构造(因此等同于第二个),还是复制构造,或默认构造,然后是移动分配?是否还有其他考虑因素需要一个或另一个选项?

c++ c++11

9
推荐指数
1
解决办法
469
查看次数

标签 统计

c++ ×2

c++11 ×2

c ×1

error-handling ×1

linux ×1

make-shared ×1

posix ×1

shared-ptr ×1

unix ×1

weak-ptr ×1