这个构造函数和析构函数发生了啥?

Posted

技术标签:

【中文标题】这个构造函数和析构函数发生了啥?【英文标题】:What's happening in this constructor and destructor?这个构造函数和析构函数发生了什么? 【发布时间】:2020-05-07 07:21:39 【问题描述】:

多年来我不得不回来使用 c++。我有点生疏了,谁能解释一下在主函数中构造和解构对象时发生了什么。

代码按预期工作。奇怪的是,如果我调试代码,调试器会在构造类时停止执行两次,在销毁时停止执行 3 次。但它停在代码的一部分,其中没有调试信息是可离开的(是的 gcc 正在生成我的调试信息)。我想对此进行调查,但我不确定代码的真正作用。

这是代码:

class LSPI_BusSymulation_SlaveDevice;

class LSPI_BusSymulation
public:
    LSPI_BusSymulation(uint16_t dataSizePerDevice, uint16_t maxNumberOfDevices, uint16_t actualNumberOfDevices);
private:
    uint16_t actualNumberOfDevices;
    std::vector<LSPI_BusSymulation_SlaveDevice> devices;
    std::vector<uint8_t> recvData;
;

class LSPI_BusSymulation_SlaveDevice
public:
    LSPI_BusSymulation_SlaveDevice(uint16_t processDataSizePerDevice, uint16_t maxNumberOfDevices);
private:
    uint16_t dataSizePerDevice;
    std::vector<uint8_t> data;
;

LSPI_BusSymulation::LSPI_BusSymulation(uint16_t dataSizePerDevice, uint16_t maxNumberOfDevices, uint16_t actualNumberOfDevices)
    : actualNumberOfDevices(actualNumberOfDevices)    
    recvData.resize(dataSizePerDevice * (maxNumberOfDevices + 1));
    devices.assign(actualNumberOfDevices, LSPI_BusSymulation_SlaveDevice(dataSizePerDevice, maxNumberOfDevices));


LSPI_BusSymulation_SlaveDevice::LSPI_BusSymulation_SlaveDevice(uint16_t processDataSizePerDevice, uint16_t maxNumberOfDevices)
    : dataSizePerDevice(processDataSizePerDevice)
    data.resize(processDataSizePerDevice * (maxNumberOfDevices + 1 + 1));


int main()    
    LSPI_BusSymulation busSymulation(10, 10, 10);
    return 0;

对我来说重要的问题是:(但如果你有时间一步一步的解释也会有所帮助)

LSPI_SYMULATION_SLAVE_DEVICE 的构造函数和析构函数多久被调用一次?

是否所有对象都存储在 busSymulation.devices 中,并且将对象与自己的内存分开?

向量 busSymulation.devices[n].data 是否也被复制或设备共享一个数据向量?

【问题讨论】:

或许您需要了解.resize 和.assign 的作用? @freakish 确定我做到了。但我不确定我是否理解正确。对于分配:我认为,分配了一个 const 对象。然后多次复制该对象。所以构造函数被调用一次。当这个向量被删除时, obecjts 析构函数被调用 vector.size() + 1 次。但我不太确定。一切正常,但调试器的行为很奇怪,这让我觉得我理解错了。 【参考方案1】:

构造函数和析构函数的频率 LSPI_SYMULATION_SLAVE_DEVICE 被调用?

构造函数

LSPI_BusSymulation_SlaveDevice::LSPI_BusSymulation_SlaveDevice(uint16_t processDataSizePerDevice, uint16_t maxNumberOfDevices)

被调用一次。复制构造函数被调用 10 次。析构函数被调用了 11 次。

是否所有对象都存储在 busSymulation.devices 中,并且将对象与自己的内存分开?

是的

向量 busSymulation.devices[n].data 是否也被复制或设备共享一个数据向量?

它被复制了。

【讨论】:

以上是关于这个构造函数和析构函数发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

27)构造和析构函数

C语言里面构造函数和析构函数的运用办法

php构造函数的PHP 5 构造函数和析构函数

构造函数和析构函数的链表问题

python中的构造函数和析构函数

构造函数和析构函数的作用[转]