gpt4 book ai didi

c++ - 在对象方法中使用 new 运算符

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:34 25 4
gpt4 key购买 nike

我是 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 吗?这个结构会在程序结束时被销毁吗,内存分配也会被销毁吗?如果没有,我可以制作一个使用删除运算符的析构函数吗?

最佳答案

如评论中所述,更好的方法是使用 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);
//...
}

这避免了定义析构函数、复制构造函数和赋值运算符(以及移动变体)的需要。这有时称为 Rule of Three (或 Rule of Three-or-Four-or-Five ):

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

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

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

关于c++ - 在对象方法中使用 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com