C++ 动态创建向量<;A级>;在类B的构造函数中,当类A在构造时分配内存时

C++ 动态创建向量<;A级>;在类B的构造函数中,当类A在构造时分配内存时,c++,constructor,stdvector,C++,Constructor,Stdvector,我是一名嵌入式开发人员。现在我是一个使用C++的项目的一部分,因为我们的C胡不支持C++,所以我的C++变得有点生疏了。我希望你们中的一些人能帮助我 我想用动态数据长度和从机数量来符号化SPI总线连接。 由于此代码测试一些用普通旧C编写的µC代码,因此有必要使symulation接口与阵列而不是conatainers一起工作 下面是我声明的类,下面是我问题的描述 class LSPI_BusSymulation_SlaveDevice; class LSPI_BusSymulation{ //

我是一名嵌入式开发人员。现在我是一个使用C++的项目的一部分,因为我们的C胡不支持C++,所以我的C++变得有点生疏了。我希望你们中的一些人能帮助我

我想用动态数据长度和从机数量来符号化SPI总线连接。 由于此代码测试一些用普通旧C编写的µC代码,因此有必要使symulation接口与阵列而不是conatainers一起工作

下面是我声明的类,下面是我问题的描述

class LSPI_BusSymulation_SlaveDevice;

class LSPI_BusSymulation{ //Interface to the Symulation-Klass
public:
    LSPI_BusSymulation(uint16_t dataSizePerDevice, uint16_t maxNumberOfDevices, uint16_t actualNumberOfDevices);

    // must use normal arrays
    uint16_t* sendSpiData(uint16_t* data, uint16_t dataSize);
private:
    uint16_t actualNumberOfDevices;
    std::vector<LSPI_BusSymulation_SlaveDevice> devices;
};

class LSPI_BusSymulation_SlaveDevice{//Symulates one bus-device, there can be several
    friend LSPI_BusSymulation;
public:
    LSPI_BusSymulation_SlaveDevice(uint16_t dataSizePerDevice, uint16_t maxNumberOfDevices);
    ~LSPI_BusSymulation_SlaveDevice();

    // must use normal arrays
    void prepareResponse(uint16_t* data, uint16_t dataSize);
    uint16_t* getBusData();

private:
    // must use normal arrays
    uint16_t* putData(uint16_t* data, uint16_t dataSize);

    uint16_t dataSizePerDevice;
    uint8_t* data;
};
我得到以下错误: *在“./a.out”中出错:双重释放或损坏(fasttop):0x00000000000EA0C20*


希望我提供了所有信息。

< P>如果你用C++使用这种容器,你就不用担心释放内存了。如果要检索原始数组指针,则始终可以访问容器分配的数据

对代码的一些示例修改

class LSPI_BusSymulation{
...
private:
    // must use normal arrays
    uint16_t* putData(uint16_t* data, uint16_t dataSize);

    uint16_t dataSizePerDevice;
     std::vector<uint8_t> data;
};
访问数据(示例代码)


您试过了吗?
LSPI\u BusSymulation
实现起来很简单,因为它不创建资源(规则为0)
LSPI\u BusSymulation\u SlaveDevice
更复杂,因为它会创建资源,因此应该遵守3/5规则。
putData(uint16\u t*data,uint16\u t dataSize)
。这是一个字节大小,还是一个元素数?考虑<代码>(UTI1616T开始,UTI1616T*EXT)这是明确的。违反了什么?转换
(uint16_t*)data.data()
很好,但取消引用结果指针却不行。@muperman我没有研究你的代码,但我同意@Evg,你在getBusData()函数中将
无符号字符转换成
无符号int
似乎很奇怪。@Jean MarcVolle我不得不这么做,因为我的测试是在dekstop计算机上运行的。在那里,我可以使用uint8\u t类型。在我的Mikrocontroller uint8上,类型不存在。硬件已知的最小类型是16位宽。@Muperman。我们偏离了您最初的关注点(构造函数中的动态分配),但如果您在模拟总线,则应确保所有数据具有相同的宽度(16位),否则,按uint16_t*增量读取uint8_t*将导致超出范围的访问(数据)访问。
int main(){    
    LSPI_BusSymulation test(10, 10, 10);

   return 0;
}
class LSPI_BusSymulation{
...
private:
    // must use normal arrays
    uint16_t* putData(uint16_t* data, uint16_t dataSize);

    uint16_t dataSizePerDevice;
     std::vector<uint8_t> data;
};
LSPI_BusSymulation_SlaveDevice::LSPI_BusSymulation_SlaveDevice(uint16_t dataSizePerDevice, uint16_t maxNumberOfDevices)
    : dataSizePerDevice(dataSizePerDevice){
    data.resize(dataSizePerDevice * (maxNumberOfDevices + 1));
}
uint16_t* LSPI_BusSymulation_SlaveDevice::getBusData(){
    return (uint16_t*)this->data.data(); // access to the container underlying allocated raw data
}