1

我对 C++ 很陌生。我正在将文件的内容读入如下结构:

struct wavObj {
    uint8_t *dataBuffer;        // the data   
    int readFile( const char *filePath );

};

int wavObj::readFile( const char *filePath ) {

    FILE *file = NULL;      // File pointer

    file = fopen( filePath, "rb" );

    dataBuffer = new uint8_t[data_Size];
    fread(dataBuffer, data_Size, 1, file);

    fclose(file);

    return 0;


}

我是否需要在某处使用删除运算符来删除 wavObj.dataBuffer?当程序结束时这个结构会被破坏吗,内存分配也会被破坏吗?如果没有,我可以制作一个使用删除运算符的析构函数吗?

4

2 回答 2

0

您应该显式声明一个析构函数来释放内存,否则可能会导致溢出。

当你的程序结束时,分配的内存不会被标记为空闲,也不会成为空闲内存池的一部分。您需要显式删除分配的内存。

但是,你也应该遵循三法则

于 2013-07-13T06:26:07.033 回答
0

正如评论中提到的,更好的方法是使用std::vector<>.

struct wavObj {
    std::vector<uint8_t> dataBuffer;        // the data   
    int readFile( const char *filePath );
};

int wavObj::readFile( const char *filePath ) {
    //...
    dataBuffer.clear();
    dataBuffer.resize(data_Size);
    fread(&dataBuffer[0], data_Size, 1, file);
    //...
}

这避免了定义析构函数、复制构造函数和赋值运算符(以及移动变体)的需要。这有时被称为三规则(或三或四或五规则):

如果您dataBuffer作为接收动态分配的裸指针离开,那么您将需要添加更多代码以正确获取您确定的内存。大多数程序员都知道要进行清理的一个地方是析构函数。

struct wavObj {
    uint8_t *dataBuffer;        // the data   
    int readFile( const char *filePath );
    ~wavObj () { delete [] dataBuffer; }
};

但是,三法则要求还需要定义复制构造函数以正确地从它正在复制的对象中复制指针,并定义一个赋值运算符以正确地清理本地副本并正确地从右手复制指针边。不这样做可能会导致由悬空指针引起的未定义行为。由于额外的复杂性,如果可能的话,最好完全避免这个问题。

于 2013-07-13T06:26:16.157 回答