使用带有纯虚基类的shared_ptr的代码有什么问题

时间:2016-09-23 02:41:24

标签: inheritance shared-ptr

此代码无法编译,但我找不到代码的错误。我认为shared_ptr很重要。

#include <memory>
#include <iostream>
using namespace std;

class A {
public:
  virtual const void test() const = 0;
  ~A() {  }
};
class AImpl : public A {
public:
  const void test() const {
    std::cout << "AImpl.test" << std::endl;
  }
};
class B {
public:
  B() {  }
  ~B() { 
  }

  shared_ptr<A> CreateA() {
    a_ = make_shared<AImpl>(new AImpl());
    return a_;
  }
private:
  shared_ptr<A> a_;
};

int main() {

  B *b = new B();
  shared_ptr<A> p = b->CreateA();
  if (b) {
    delete b;
    b = NULL;
  }
}

1 个答案:

答案 0 :(得分:1)

您错误地使用了make_shared。你不需要在new中使用make_shared,它会破坏这个函数模板的整个目的。

  

此功能通常用于替换构造   std :: shared_ptr(new T(args ...))来自raw的共享指针   调用new返回的指针。与那个表达形成对比,   std :: make_shared通常为T对象分配内存   对于具有单个内存的std :: shared_ptr控制块   分配(这是标准中的非约束性要求),其中   std :: shared_ptr(new T(args ...))执行至少两个内存   分配。

a_ = make_shared<AImpl>(); // correct
//a_ = make_shared<AImpl>(new AImpl()); // not correct