在执行动态内存时,程序崩溃的主要原因是什么?
我有一个类,在.h文件中定义了以下公共指针:
char *data;
我的程序有一个main函数,我按顺序创建这个类的对象,在这个创建中我做了内存部分:
data = new char[dataSize];
主要功能,执行一次(objetcs创建10次)完美运行。但是,当我再次运行main函数(没有关闭程序)时,有一段时间指令 data = new char [dataSize] 崩溃了程序(执行突然结束,所以我无法调试或者看到任何东西)。
顺便说一下,每次创建对象时,指针都会初始化为NULL(对于内存部分)。
这是代码。首先,主要功能,用不同的对象执行20次:
CBinFileHwd validEpsData1;
validEpsData.loadFile(lpcTheFile3,dwFileSize,FT_BIT);
因此函数的下一行与上面的相同,但不是validEpsData1,而是validEpsData2,最多18次(validEpsData17)。
班级代码(.c):
CBinFileHwd::CBinFileHwd()
{
status = FILE_NOT_LOADED;
fileType = FT_UNKNOWN;
data = NULL;
currentPos = 0;
dataSize = 0;
}
CBinFileHwd::~CBinFileHwd()
{
if (data!=NULL) {
delete [] data;
data= NULL;
}
fileType = FT_UNKNOWN;
status = FILE_NOT_LOADED;
}
int CBinFileHwd::loadFile(const char *fileName, const unsigned long int &maxSize, const E_FILE_TYPE &fType)
{
// Open input file
int fd = open(fileName,O_RDONLY | O_BINARY);
if (fd < 0) {
char logString[1024];
sprintf(logString,"Error opening file %s",fileName);
logMessage(logString, false, false, false);
fileType = FT_UNKNOWN;
status = FILE_NOT_LOADED;
return -1;
}
dataSize = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
if (maxSize < dataSize) {
dataSize = maxSize;
}
data = new char[dataSize];
unsigned long int dataRead = 0;
while (dataRead < dataSize){
dataRead += read(fd, &data[dataRead], BLOCK_SIZE);
}
// Close file
close(fd);
status = FILE_LOADED;
fileType = fType;
if (maxSize != dataSize) {
return 1;
}else{
return 0;
}
}
班级代码(.h):
typedef enum{FT_BIT,FT_INT,FT_DOUBLE, FT_UNKNOWN} E_FILE_TYPE;
class CBinFileHwd
{
private:
static const int BLOCK_SIZE = 4096;
typedef enum{FILE_NOT_LOADED, FILE_LOADED} E_STATUS;
E_STATUS status;
E_FILE_TYPE fileType;
char *data;
unsigned long int currentPos;
unsigned long int dataSize;
public:
CBinFileHwd();
~CBinFileHwd();
int loadFile(const char *fileName, const unsigned long int &maxSize, const E_FILE_TYPE &fType);
};
答案 0 :(得分:0)
这可能是因为:
因为为此类编写的复制构造函数和赋值运算符不正确而双重释放。由于这个多个对象可能指向相同的动态内存分配。如果输入数据大小不超过128字节长度(即分配大小),构造函数和析构函数看起来没问题。
这也可能是因为您的程序中的堆内存损坏,这段代码可能只是其他实际损坏的受害者/后果。
但是,一旦发布代码,我们可能会更好地找出崩溃的原因。
答案 1 :(得分:0)
由于我在上面的回答中提到的第1点,看起来你的程序崩溃了。
似乎还有一个内存泄漏问题,因为“data”是类的成员变量,一旦多次调用loadFile()函数,数据就会被更新的内存地址覆盖。这也是代码中的一个大问题。
可能你想在分配“数据”内存之前进行检查。
int CBinFileHwd::loadFile
{
...................
if(data != nullptr) {
data = new char[dataSize];
}
unsigned long int dataRead = 0;
..........................
}
答案 2 :(得分:0)
尝试:
dataRead += read(fd, (data+dataRead), BLOCK_SIZE);
您是否意外地分配了相同的变量&#39; validEpsData&#39;所有18次,在这种情况下你有内存泄漏。你在哪里宣布这个变量?
validEpsData.loadFile(lpcTheFile3,dwFileSize,FT_BIT);
应该是:
validEpsData1.loadFile(lpcTheFile3,dwFileSize,FT_BIT);
......
validEpsData18.loadFile(lpcTheFile3,dwFileSize,FT_BIT);
在你超出main()范围之外或者换句话说退出程序时,不会调用析构函数