此代码无法编译,但我找不到代码的错误。我认为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;
}
}
答案 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