创建继承类 导致内存不足 求解!!!

时间:2021-09-30 18:18:20
数据结构
class DeviceParam
{
public:
int    mlc;     
int    lmd;     
double  fenbianlv;
int    qlxz; 
double  kxiuzheng;
double  resistance1;
double  resistance2;
double  moliang;
double  bosongbi;
char   danwei[10];
};
class DeviceChannel:virtual public DeviceParam
{
public:
double  initialdata;
double  showdata;
public:
 DeviceChannel()
{
///初始化
}
void InitialVlaue(double mydata)//初始值
{
}
double ShowValue(BOOL plusFlag)
{
  return 数据; 
}

};
class DeviceMachine:virtual DeviceChannel
{
public:
DeviceChannel OneTD[CHANNEL_NUM];
void SetChannelData(double *m_data,int channel,int type)
{
}
void GetChannelData(double *m_data,int channel,int type)////一列数据所有通道
{
}
};
class DeviceData:virtual DeviceMachine
{
public:
int m_channel;
int m_machine;
char Time_Data[50];
DeviceMachine SB_TD_Data[MACHINE_NUM];
double PH_Value[MACHINE_NUM][CHANNEL_NUM];
public:
 void GetChannelNum(int num);
 BOOL SaveData(char time_data[],int machine,int channel, CString filepath);
 void PH_Zero();
 void WritePhZero(CString filePath);
 BOOL ReadPhZero(CString filePath);
 
};
在菜单中打开文件后
m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足
怎样修改数据结构啊?

18 个解决方案

#1


哪位高手抽出点时间给指导一下啊!

#2


先把m_savenum改小一点试试看,比如m_savenum=1;

引用 楼主 gomez11544 的回复:
数据结构
class DeviceParam
{
public:
int    mlc;     
int    lmd;     
double  fenbianlv;
int    qlxz; 
double  kxiuzheng;
double  resistance1;
double  resistance2;
double  moliang;
double  bosongbi;
char   danwei[10];
};
class DeviceChannel:virtual public DeviceParam
{
public:
double  initialdata;
double  showdata;
public:
 DeviceChannel()
{
///初始化
}
void InitialVlaue(double mydata)//初始值
{
}
double ShowValue(BOOL plusFlag)
{
  return 数据; 
}

};
class DeviceMachine:virtual DeviceChannel
{
public:
DeviceChannel OneTD[CHANNEL_NUM];
void SetChannelData(double *m_data,int channel,int type)
{
}
void GetChannelData(double *m_data,int channel,int type)////一列数据所有通道
{
}
};
class DeviceData:virtual DeviceMachine
{
public:
int m_channel;
int m_machine;
char Time_Data[50];
DeviceMachine SB_TD_Data[MACHINE_NUM];
double PH_Value[MACHINE_NUM][CHANNEL_NUM];
public:
 void GetChannelNum(int num);
 BOOL SaveData(char time_data[],int machine,int channel, CString filepath);
 void PH_Zero();
 void WritePhZero(CString filePath);
 BOOL ReadPhZero(CString filePath);
 
};
在菜单中打开文件后
m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足
怎样修改数据结构啊?

#3


数量小了是可以的

#4


将类定义中的大数组改为指针,构造时new
试试看

#5


将类定义中的大数组改为指针,构造时new,析构时delete
试试看

#6


DeviceParam//参数类
class DeviceChannel:virtual public DeviceParam//通道类继承参数类
class DeviceMachine:virtual DeviceChannel//机箱类继承通道类
class DeviceData:virtual DeviceMachine//数据类继承机箱类
最后
m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足

#7


引用 3 楼 gomez11544 的回复:
数量小了是可以的

自己可以分析一下,先sizeof你的结构体看是多大,然后再乘以你要分配的个数,看看这么大的内存分起来有没有什么问题。

#8


类定义中没有大数组 就是在打开文件时 m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足
是不是我的数据结构安排的不合理啊

#9


我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

#10


如果你只有1G的内存条,却要申请2G的内存,自然会出错
如果你有4G的内存,却已经被其他程序使用了1G,而且这1G还是零散分布在4G的范围内,那么当你想要申请1G内存的时候,可能已经没有连续的1G空闲内存了,这时也会出错

修改数据结构,不使用过大的连续内存
要么空间上拆成很多块分布在整个内存中,要么分时间一次处理一小部分

#11


引用 9 楼 gomez11544 的回复:
我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

大小是4的那是指针

DeviceMachine SB_TD_Data[MACHINE_NUM];
double PH_Value[MACHINE_NUM][CHANNEL_NUM];
一个一维数组一个二维数组,虽然不知道这两个宏都被定义成多少,但大小小不了

#12


我这样嵌套继承是不是不对啊?

#13


类中的数组(如SB_TD_Data[MACHINE_NUM]  PH_Value[MACHINE_NUM][CHANNEL_NUM])都用指针吧,然后new吧。

#14


MACHINE_NUM=33
CHANNEL_NUM=33

我是这样设计数据结构的 先有一个参数类,其次通道类继承参数类
机箱类在继承通道类,最后创建数据类来继承机箱类
实例化大量数据类

#15


引用 14 楼 gomez11544 的回复:
MACHINE_NUM=33
CHANNEL_NUM=33

我是这样设计数据结构的 先有一个参数类,其次通道类继承参数类
机箱类在继承通道类,最后创建数据类来继承机箱类
实例化大量数据类


主要是那个二维数组PH_Value, 33*33*30000很大。

#16


引用 9 楼 gomez11544 的回复:
我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

明显不对啊,你的代码是定义了一个指针,然后给这个指针分配了sizeof(DeviceData)x30000个byte的内存空间,你算算要分多大!

#17


引用 16 楼 bijiaoben 的回复:
Quote: 引用 9 楼 gomez11544 的回复:

我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

明显不对啊,你的代码是定义了一个指针,然后给这个指针分配了sizeof(DeviceData)x30000个byte的内存空间,你算算要分多大!

没说明白,不是你的数据结构不对,是你对指针理解错了。指针变量占用的空间大小是4个byte,但是后面的new操作时在为这个指针向系统申请可以使用的内存空间,这段内存空间的大小是sizeof(DeviceData)x30000,而且是要求连续的。

#18


谢谢大家,问题解决了!!!

#1


哪位高手抽出点时间给指导一下啊!

#2


先把m_savenum改小一点试试看,比如m_savenum=1;

引用 楼主 gomez11544 的回复:
数据结构
class DeviceParam
{
public:
int    mlc;     
int    lmd;     
double  fenbianlv;
int    qlxz; 
double  kxiuzheng;
double  resistance1;
double  resistance2;
double  moliang;
double  bosongbi;
char   danwei[10];
};
class DeviceChannel:virtual public DeviceParam
{
public:
double  initialdata;
double  showdata;
public:
 DeviceChannel()
{
///初始化
}
void InitialVlaue(double mydata)//初始值
{
}
double ShowValue(BOOL plusFlag)
{
  return 数据; 
}

};
class DeviceMachine:virtual DeviceChannel
{
public:
DeviceChannel OneTD[CHANNEL_NUM];
void SetChannelData(double *m_data,int channel,int type)
{
}
void GetChannelData(double *m_data,int channel,int type)////一列数据所有通道
{
}
};
class DeviceData:virtual DeviceMachine
{
public:
int m_channel;
int m_machine;
char Time_Data[50];
DeviceMachine SB_TD_Data[MACHINE_NUM];
double PH_Value[MACHINE_NUM][CHANNEL_NUM];
public:
 void GetChannelNum(int num);
 BOOL SaveData(char time_data[],int machine,int channel, CString filepath);
 void PH_Zero();
 void WritePhZero(CString filePath);
 BOOL ReadPhZero(CString filePath);
 
};
在菜单中打开文件后
m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足
怎样修改数据结构啊?

#3


数量小了是可以的

#4


将类定义中的大数组改为指针,构造时new
试试看

#5


将类定义中的大数组改为指针,构造时new,析构时delete
试试看

#6


DeviceParam//参数类
class DeviceChannel:virtual public DeviceParam//通道类继承参数类
class DeviceMachine:virtual DeviceChannel//机箱类继承通道类
class DeviceData:virtual DeviceMachine//数据类继承机箱类
最后
m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足

#7


引用 3 楼 gomez11544 的回复:
数量小了是可以的

自己可以分析一下,先sizeof你的结构体看是多大,然后再乘以你要分配的个数,看看这么大的内存分起来有没有什么问题。

#8


类定义中没有大数组 就是在打开文件时 m_savenum=30000;
DeviceData *m_data=new DeviceData[m_savenum];//显示内存不足
是不是我的数据结构安排的不合理啊

#9


我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

#10


如果你只有1G的内存条,却要申请2G的内存,自然会出错
如果你有4G的内存,却已经被其他程序使用了1G,而且这1G还是零散分布在4G的范围内,那么当你想要申请1G内存的时候,可能已经没有连续的1G空闲内存了,这时也会出错

修改数据结构,不使用过大的连续内存
要么空间上拆成很多块分布在整个内存中,要么分时间一次处理一小部分

#11


引用 9 楼 gomez11544 的回复:
我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

大小是4的那是指针

DeviceMachine SB_TD_Data[MACHINE_NUM];
double PH_Value[MACHINE_NUM][CHANNEL_NUM];
一个一维数组一个二维数组,虽然不知道这两个宏都被定义成多少,但大小小不了

#12


我这样嵌套继承是不是不对啊?

#13


类中的数组(如SB_TD_Data[MACHINE_NUM]  PH_Value[MACHINE_NUM][CHANNEL_NUM])都用指针吧,然后new吧。

#14


MACHINE_NUM=33
CHANNEL_NUM=33

我是这样设计数据结构的 先有一个参数类,其次通道类继承参数类
机箱类在继承通道类,最后创建数据类来继承机箱类
实例化大量数据类

#15


引用 14 楼 gomez11544 的回复:
MACHINE_NUM=33
CHANNEL_NUM=33

我是这样设计数据结构的 先有一个参数类,其次通道类继承参数类
机箱类在继承通道类,最后创建数据类来继承机箱类
实例化大量数据类


主要是那个二维数组PH_Value, 33*33*30000很大。

#16


引用 9 楼 gomez11544 的回复:
我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

明显不对啊,你的代码是定义了一个指针,然后给这个指针分配了sizeof(DeviceData)x30000个byte的内存空间,你算算要分多大!

#17


引用 16 楼 bijiaoben 的回复:
Quote: 引用 9 楼 gomez11544 的回复:

我创建多少个DeviceData 对象大小都是4,我的数据结构不对吧?

明显不对啊,你的代码是定义了一个指针,然后给这个指针分配了sizeof(DeviceData)x30000个byte的内存空间,你算算要分多大!

没说明白,不是你的数据结构不对,是你对指针理解错了。指针变量占用的空间大小是4个byte,但是后面的new操作时在为这个指针向系统申请可以使用的内存空间,这段内存空间的大小是sizeof(DeviceData)x30000,而且是要求连续的。

#18


谢谢大家,问题解决了!!!