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