gpt4 book ai didi

c++ - Pointer-to-Pointer 在 Pointer 不存在的情况下崩溃

转载 作者:可可西里 更新时间:2023-11-01 13:20:21 30 4
gpt4 key购买 nike

我正在将一些代码移植到 Windows 并且被难住了。有一些代码在启动时自动运行以将指针复制到指针,并在退出时再次运行以删除指向指针的指针(如果它不为空)。

我已经创建了一个示例程序来重现该行为

int main()
{
// Pointer to a Pointer, current crash.
InterfaceClass** ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = (InterfaceClass**)(&object); // cast is required for some reason.
delete *ptrptr; // Crash here.

// Single pointer, works fine.
InterfaceClass* ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = object;
delete ptrptr;

// There are other cases where there are only 3 classes in the hierarchy.
// This also works fine.
InterfaceClass** ptrptr;
ConcreteOne* object = new ConcreteOne();
ptrptr = (InterfaceClass**)(&object);
delete *ptrptr;

return 0;
}

类层次结构如下所示。基类是一个带有一些纯虚函数的接口(interface),并且被整个程序中的许多类所包含,其方式使得许多对象可能从多个地方继承它。因此,具体实现必须使用“公共(public)虚拟接口(interface)类”对其进行扩展。在此示例中,删除“虚拟”可解决崩溃问题。

class InterfaceClass {
public:
virtual ~InterfaceClass() {};
InterfaceClass() {}
};

class ConcreteClass : public virtual InterfaceClass {
public:
ConcreteClass() { }
virtual ~ConcreteClass() {}
};

class ConcreteOne : public ConcreteClass
{
public:
ConcreteOne(void) {}
virtual ~ConcreteOne(void) {}
};

class ConcreteTwo : public ConcreteOne
{
public:
ConcreteTwo(void) {}
virtual ~ConcreteTwo(void) {}
};

最佳答案

那么您是否熟悉指针的类型与它指向的类型几乎没有任何关系这一事实?换句话说,您认为如果 T1 继承自 T2,那么 T1* 也继承自 T2*?那是错误的。现在,这如何适用于您当前的情况?

  InterfaceClass** ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = (InterfaceClass**)(&object); // cast is required for some reason.

这是 C 风格转换的一个主要问题。好的,所以它节省了一些水平空间,但你知道你刚刚做了什么样的 Actor 吗?这不是你想的那样。您实际上执行了从类型 ConcreteTwo* 到不相关类型 InterfaceClass* 的reintpret_cast!现在指针地址与您所说的类型无关。

然后你将一个重新解释的指针类型扔到 delete 中,这立即导致你侵犯了你自己的括约肌。

关于c++ - Pointer-to-Pointer 在 Pointer 不存在的情况下崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4474468/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com