【问题标题】:How to delete a object that attached another object in C++?如何删除在 C++ 中附加了另一个对象的对象?
【发布时间】:2016-01-31 03:45:47
【问题描述】:

我正在做这个单元测试。我想把电钻和电池都删了,但是好像不行(电池可能不能删)。我可以对析构函数做任何事情来处理这个问题吗?

 void test_rover::testDisconnectBattery() {
        Drill* drill = new Drill();
        drill->connectBattery(new Battery(10));
        drill->disconnectBattery();

        //CPPUNIT_ASSERT(drill->Connected()==false);
        delete drill;
        CPPUNIT_ASSERT(Object::getCount()==0);
    }

Device.cpp(Device是drill的基础)

    Device::Device() {
    }

    Device::Device(const Device& copy) {
    }

    Device::~Device() {
       delete _battery;
    }

    void Device::connectBattery(Battery *b){ 
        _battery = b;
    }

    void Device::disconnectBattery(){
        _battery = NULL;
    }

电池.cpp

Battery::Battery(int power) {
    _power = power;
}

Battery::Battery(const Battery& copy) {
}

Battery::~Battery() {
}

int Battery::Power(){
    return _power;
}

【问题讨论】:

  • 调用析构函数(~Device)时,_batteryNULL,断开或外接电池时需要delete电池
  • 您使用的是 C++,为什么不使用适合的 std::shared_ptr 或 std::unique_ptr?
  • 我刚刚添加了一个“删除_电池;”在disconnectBattery()中,但它仍然不起作用..
  • 另外 - 你为什么首先使用 ANY 指针?为什么不让 Battery 成为 Drill 的成员?而且,你永远不会在 Drill 的构造函数中初始化 _battery...
  • 如果我调用connectBattery 并在堆栈上分配了击球手怎么办?

标签: c++ unit-testing destructor delete-operator


【解决方案1】:

disconnectBattery 首先被调用,它使指向电池的指针变为空。然后当你delete drill 时,析构函数被调用但指针为空,所以delete 命令什么也不做。

您正在处理的问题是所有权问题。哪段代码“拥有”电池?如果是电钻,则电钻应在完成后删除电池(在断开连接期间,在指针归零之前)。如果其他一些代码拥有电池,那么钻头不应该删除电池。您需要对此做出决定,以便始终如一地实施所有权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2018-02-23
    • 2010-11-29
    • 2017-05-07
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多