1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
public:
A();
~A();
private:
Data* data;
};

class AX : public A {
public:
AX();
~AX();
private:
AXData* ax_data;
};

以下不会存在内存泄漏的写法是?

A. AX* p = new AX(); delete p;

B. A* p = new AX(); delete p;

C. shared_ptr<A> p = shared_ptr<A>(make_shared<AX>()); delete p;

D. shared_ptr<A> p = shared_ptr<A>(make_shared<A>()); delete p;

正确答案: A,C,D

解析:

B:基类析构函数没有声明为 virtual ,所以 p 所指的对象析构时,不会调用基类的析构函数。

D:正常情况,显然不会内存泄漏。

C:shared_ptr创建时会记住原来的类型的析构函数,基类指针析构时仍会调用派生类的析构函数。


shared_ptr 创建时即捕获析构动作,何解?

本人也不懂。。。待笔者读完《STL源码剖析》后再回来解释。

你不一定知道的智能指针细节 - 知乎 (zhihu.com)