几次使用动态char数组后出现未知崩溃

时间:2014-02-26 17:27:02

标签: c++ pointers memory char

在执行动态内存时,程序崩溃的主要原因是什么?

我有一个类,在.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);
};

3 个答案:

答案 0 :(得分:0)

这可能是因为:

  1. 因为为此类编写的复制构造函数和赋值运算符不正确而双重释放。由于这个多个对象可能指向相同的动态内存分配。如果输入数据大小不超过128字节长度(即分配大小),构造函数和析构函数看起来没问题。

  2. 这也可能是因为您的程序中的堆内存损坏,这段代码可能只是其他实际损坏的受害者/后果。

  3. 但是,一旦发布代码,我们可能会更好地找出崩溃的原因。

答案 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()范围之外或者换句话说退出程序时,不会调用

析构函数