【发布时间】:2014-02-26 17:27:01
【问题描述】:
在做动态内存的时候,导致程序崩溃的主要原因是什么?
我有一个类,在 .h 文件中定义了以下公共指针:
char *data;
我的程序有一个 main 函数,我在其中按顺序创建这个类的对象,在这个创建过程中我做了内存部分:
data = new char[dataSize];
主函数,执行一次(对象被创建 10 次)完美运行。但是,当我再次运行 main 函数(没有关闭程序)时,指令 data = new char[dataSize] 会导致程序崩溃(执行突然结束,所以我无法调试或查看任何东西)。
顺便说一句,每次创建对象时指针都会初始化为 NULL(在内存部分之前)。
这是代码。首先是 main 函数,它使用不同的对象执行了 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);
};
【问题讨论】:
-
我相信您需要发布更多代码。例如,您的主要功能。
-
你删除内存吗?如果是,你使用
delete[]吗? -
我敢打赌这是由于某种原因导致堆栈损坏。没有看到代码就无法确定。
-
你说的再次运行main函数(不关闭程序)是什么意思?
-
@cuartango,我们也不知道。发布代码以获得答案。