gpt4 book ai didi

c++ - 删除派生对象时的行为

转载 作者:太空狗 更新时间:2023-10-29 23:33:26 25 4
gpt4 key购买 nike

这是基于真实问题的虚构场景。如果我有一个基类:

class Vehicle
{
public:
void run() { incrementStuff(); }
virtual void incrementStuff() { }
};

派生类:

class Car : public Vehicle
{
public:
Car() : Vehicle() { stuff = new StuffClass(); }
~Car() { delete stuff; stuff = NULL; }

virtual void incrementStuff() { if (stuff != NULL) stuff->increment(); }

protected:
StuffClass* stuff;
};

然后假设我有一个定期调用 Vehicle::run() 的线程。我有另一个线程最终删除了指向汽车的指针。销毁顺序将导致首先删除汽车,然后删除车辆。

如果线程(存在于 Vehicle 对象中)在析构函数在 car 中运行之后(但显然是在 vehicle 被破坏之前)调用 incrementStuff 函数,会发生什么情况?是否会执行 Car::incrementStuff 并尝试取消引用已删除的指针?还是会调用 Vehicle::incrementStuff,它是安全的并且什么都不做?

假设当 Car::~Car() 正在运行时,线程无法调用 Car::incrementStuff(这是通过互斥锁阻止的)。

这段代码已经过重构以避免这种情况,但我只是想知道是否有人可以阐明它是如何工作的,或者它是否只是普通的未定义行为?

更一般地说,如果我尝试在 Car 被销毁之后但 Vehicle 被销毁之前调用 Car::incrementStuff 会发生什么? NULL 检查是否有效,或者该内存是否已经被释放并且现在可以被任何东西使用?或者在基础对象被破坏之前,内存不会被“释放”?

最佳答案

如果您删除了 Car 对象,则随后对 incrementStuff() 的调用是未定义的行为。

顺便说一句,您可能应该在Vehiclevirtual 中创建析构函数。请参阅:When to use virtual destructors?

关于c++ - 删除派生对象时的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347993/

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