首页 > 试题广场 >

(C++)设 A 为基类,AX 为派生类, class A

[不定项选择题]
(C++)设 A 为基类,AX 为派生类,
class A {
public:
  A();
  ~A();

  Data* data;
};

class AX : public A {
public:
  AX();
  ~AX();

  AXData* ax_data;
};
以下不会内存泄漏的写法吗?
  • AX* p = new AX(); delete p;
  • A* p = new AX(); delete p;
  • std::shared_ptr<AX> p{new AX()};
  • std::shared_ptr<A> p{new AX()};
D为啥对
发表于 2021-02-22 03:28:40 回复(0)
如果基类析构函数不是虚函数,Base *d = new Derived(); 这样定义的d在析构的时候只会调用Base自己的析构函数,delete d; 运行的时候,Derived自己的数据成员不会被销毁,造成内存泄漏。也就是说题目中的AXData* ax_data不会被释放。
发表于 2021-01-11 10:15:59 回复(0)
shared_ptr创建时会记住原来的类型的析构函数,因此D在计数器为0时会调用派生类的析构函数。
发表于 2021-09-11 17:53:26 回复(0)
AC很容易判断,由于析构函数不是virtual,所以只能是子类的指针。但D有很大迷惑性,虽然p指针是类似A*的效果,但析构时,是调用的创建对象的析构函数,当然也可以指定别的析构函数。
发表于 2022-03-20 22:39:04 回复(0)

对于D选项,在万能的知乎中找到了解释,简单地说,“智能指针解引用时的指针” 和“所有共享所有权的智能指针共同管理的对象”未必是相同的类型;在引用计数为0时销毁所管理的对象会调用当初赋值时的对象类型;
附上知乎链接:
基类智能指针析构派生类对象的问题?

发表于 2021-03-26 15:09:09 回复(1)
智能指针会保留原始指针,所以能正确调用吧
发表于 2023-07-07 15:47:52 回复(0)
如果确定一个类要被继承,把他的析构函数设置为虚函数。
发表于 2021-09-27 14:59:20 回复(0)
这题有点难以理解啊
发表于 2021-08-05 20:12:05 回复(0)
求大佬解释一下
发表于 2020-11-23 10:13:54 回复(1)
D 选项为什么对呢?求指教
发表于 2020-08-16 14:04:45 回复(3)