2015-10-30 91 views
0

我正在进行这个单元测试。我想删除钻头和电池,但似乎不起作用(也许电池不能被删除)。我可以在析构函数上做任何事情来处理这个问题吗?如何删除C++中连接另一个对象的对象?

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::Device() { 
    } 

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

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

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

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

Battery.cpp

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

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

Battery::~Battery() { 
} 

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

当析构函数('〜Device')被调用,'_battery'为'NULL'时,您需要在断开连接或外部连接时删除电池 –

+3

使用std :: unique_ptr –

+0

您正在使用C++,为什么你不使用std :: shared_ptr或std :: unique_ptr,因为它适合? – Nandu

回答

0

disconnectBattery首先被调用,其空值出指针到电池。然后,当delete drill时,析构函数被调用,但指针为空,因此delete命令不执行任何操作。

您正在处理的问题是所有权问题之一。什么代码“拥有”电池?如果是钻,那么钻完成后应该删除电池(在断开连接过程中,在清空指针之前)。如果其他代码拥有电池,则钻机不应该删除电池。您需要对此做出决定,以便始终如一地执行所有权。

相关问题