guang19 最近的时间轴更新
guang19

guang19

V2EX 第 575663 号会员,加入于 2022-03-16 14:50:50 +08:00
请教一个 shared_ptr 内存泄漏的问题
程序员  •  guang19  •  2022-05-11 01:07:11 AM  •  最后回复来自 ColorfulBoar
22
我这样实现 Time Thread 是否可行?
程序员  •  guang19  •  2022-04-30 23:21:16 PM  •  最后回复来自 guang19
2
请教关于 muduo 库的问题
程序员  •  guang19  •  2022-04-30 17:12:12 PM
guang19 最近回复了
2022-08-29 16:26:17 +08:00
回复了 DonaldY 创建的主题 程序员 分享文章: TCP 粘包? TCP 警察什么梗
把协议设计好基本不会出现所谓的“粘包”
2022-06-30 11:14:24 +08:00
回复了 byte10 创建的主题 程序员 关于 jetbrains 涨价问题, intellij idea VS vscode 对比请教
总有人拿一个文本编辑器跟一个 IDE 比较,这究竟是道德的沦丧还是人性的扭曲呢?
看了下,你这 SEO 怎么解决呢?
2022-05-10 16:25:47 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
@ColorfulBoar 惊了,学习了,谢谢大佬。
2022-05-10 16:04:04 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
@ColorfulBoar 等 5 秒中都不执行的线程,非要手工指定 join 或 detach 状态的线程,你觉得离谱吗?
2022-05-10 15:50:11 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
@ColorfulBoar 那请你帮个忙把这段代码贴到 linux 下去运行下,这个线程会不会执行,我的 archlinux 和 ubuntu 反正是不行的:
````
::std::thread t1([] ()
{
::printf("%s\n", "hello world");
});
::std::this_thread::sleep_for(::std::chrono::milliseconds(5000));
````
2022-05-10 13:09:52 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
@elfive 因为我写的这个库是基于 linux 的,所以自己基于 posix pthread 封装的线程,cpp11 的 thread 太难用了,跟坨屎一样,创建之后非要调 join 或 detach 才会执行,join 阻塞主线程就不说了,而 detach 更是难用。
2022-05-10 13:05:30 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
@statumer 谢谢老哥,我大概知道为什么 use_count 为 3 了,在 shared_ptr 传参的过程中被复制了几次,所以造成引用次数不一致。有时候任务线程执行的快,被拷贝的 shared_ptr 来不及析构,lambda 此时执行的时候的 use_count 就是 3 ;任务线程执行的慢,等其他被拷贝的被析构了,只剩下 lambda 捕获的 shared_ptr 了,此时执行 use_count 就是 1 。我又测试了好多遍,虽然 use_count 不一致,但 task 执行的结果却没错,这证明了 lambda 只会是最后一个 shared_ptr ,lambda 结束后并不会造成泄漏。
2022-05-10 12:40:34 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
又 debug 了下,大概是我阻塞队列写的有点问题。。。
2022-05-10 11:52:29 +08:00
回复了 guang19 创建的主题 程序员 请教一个 shared_ptr 内存泄漏的问题
我这样写也有问题:
````
auto asyncTask = ::std::make_shared<::std::packaged_task<RetType ()>>(
::std::bind(::std::forward<Fn>(func), ::std::forward<Args>(args)...));
auto future = asyncTask->get_future();
TaskType task = [asyncTask]() mutable
{
assert(asyncTask.use_count() == 1);
(*asyncTask)();
};
assert(asyncTask.use_count() == 2);
````

我发现这应该是 lambda 捕获 shared_ptr 引用错乱的问题,可能不是我代码的问题
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5572 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 01:39 · PVG 09:39 · LAX 18:39 · JFK 21:39
Developed with CodeLauncher
♥ Do have faith in what you're doing.