【发布时间】:2019-10-01 19:43:24
【问题描述】:
我已经实现了下面这段代码
#include <iostream>
#include <memory>
class A
{
public:
int a;
virtual ~A()
{
}
};
class B : public A
{
public:
int b;
virtual ~B()
{
}
};
class E : public B
{
public:
~E()
{
}
};
class D
{
public:
operator std::shared_ptr<A>()
{
std::shared_ptr<A> pa = std::make_shared<A>();
pa->a = this->y;
return pa;
}
operator std::shared_ptr<B>()
{
std::shared_ptr<A> pb = std::make_shared<B>();
pb = *this;
(std::static_pointer_cast<B>(pb))->b = this->x;
return std::static_pointer_cast<B>(pb);
}
virtual ~D()
{
}
int x;
int y;
};
int main()
{
D d;
d.x = 6;
d.y = 7;
std::shared_ptr<E> pE = std::make_shared<E>();
std::shared_ptr<A> pa = pE;
std::shared_ptr<B> pB = std::dynamic_pointer_cast<B>(pa);
pB = d;
std::cout << "a " << pB->a << "b " << pB->b << std::endl;
return 0;
}
我尝试做的是将类D、d 的实例转换为派生自类A 的共享指针B 的实例。
B 继承类A,E 继承类B。
程序终止时,程序在A类的析构函数中崩溃。
我使用 GDB 发现 this 为 NULL。
有人知道为什么会这样吗?
【问题讨论】:
-
进行以下更改 (std::dynamic_pointer_cast(pb))->b = this->x;返回 std::dynamic_pointer_cast(pb);程序在 this->x 的分配中崩溃。 pb 为 NULL。
-
没错。这告诉您您正在以无效的方式访问
pb,因为它没有指向有效的B对象,因此您不能将A指针转换为B指针。您需要修复您的operator std::shared_ptr<B>()才能对有效的B对象进行操作。