我觉得这话可能会被挨喷, shared_ptr的泛滥,其实就是集体摆烂的结果。 用shared_ptr怎么了?至少比裸指针安全吧?不会内存泄漏吧?代码能跑吧? 我发现其实有个规律: 越是从java或者python转过来的程序员,越喜欢无脑用shared_ptr。 用java写了几年gc语言,脑子里根本没有所有权这个概念。对象创建. 2. 1 更高效的内存分配 make_shared 在构造 shared_ptr 的时候,会 一次性分配两块内存,一块用于存储对象本身,另一块用于存储引用计数(shared_ptr 的控制块)。 而使用 new 时,内存分配是分开的,需要两次分配:一次为对象分配内存,另一次为引用计数块分配内存。 这个规律,在工业级 sdk 开发中被反复验证:std::shared_ptr 不应出现在公共 dll 接口的返回类型中。 一、shared_ptr 跨 dll 边界特危险 dll 边界不是 c++ 编译单元的自然延伸,而是 abi 的硬隔离墙。 而 std::shared_ptr 的实现细节,包括对象指针、控制块、引用计数、deleter等,全部由标准库头文件内联展开. 当两个shared_ptr销毁的时候,这两个智能指针对应的控制块内的引用计数会先后减至0,这将导致这个对象会释放两次,一个对象被释放两次会导致未定义的行为(可能导致程序异常崩溃)这绝对是不能接受的 enable_shared_from_this的使用 为了保证不出现上面的情况,c++引入了enable_shared_from_this来解决这个. 我其实很不喜欢enable_shared_from_this,首先它返回的是一个shared_ptr,不是weak_ptr,考虑到循环引用,更推荐只有一处shared,剩下的全weak 其次这货需要继承,这意味着它是侵入性的,如果你的对象已经继承自某个object类了,总不能多继承吧 还有就是这货要求对象一定在对象,但是又没有在编译期禁止.