考虑此类:
class Packet {
public:
Packet();
~Packet();
void allocateBuffer(unsigned int size);
void deallocateBuffer();
char* getBuffer() const;
private:
char* buffer;
};
使用以下方法:
Packet::Packet():
buffer(NULL) {
std::cout << "[DEBUG] Construct Packet class..." << std::endl;
}
void Packet::allocateBuffer(unsigned int size) {
if (!(buffer)) {
buffer = new char[size];
#ifdef DEBUG
std::cout << "Allocate buffer memory..." << std::endl;
#endif
}
}
void Packet::deallocateBuffer() {
if (buffer) {
delete[] buffer;
buffer = NULL;
#ifdef DEBUG
std::cout << "Deallocate buffer memory..." << std::endl;
#endif
}
}
以下是一些问题:
NULL
,因此上面列出的实现是处理类内部指针的好方法吗?我之所以这样问是因为,如果buffer
变量没有在构造函数中初始化,默认情况下似乎会为其分配一个奇怪的\v
值。 答案 0 :(得分:6)
- 由于C指针如果不指向任何内容,则等于NULL,因此上面列出的实现是处理类内部指针的好方法吗?我之所以这样问,是因为如果未在构造函数中初始化缓冲区变量,则默认情况下似乎会为其分配一个奇怪的\ v值。
您应该始终注意在类构造函数中初始化非静态成员变量,除非它们是非原始类型,并且它们自己负责初始化。
否则,访问它们将暴露未定义的行为。
您应该注意,非静态类成员变量没有默认初始化。
另外,对于c ++,您应该使用nullptr
而不是NULL
来初始化原始指针。
- 如果不是,您能建议更优雅的方法吗?
当然,只需使用一个std::vector<char>
成员变量,它将自动为您完成所有分配/释放内存管理。
要通过原始指针访问原始数据,请使用std::vector::data()
函数重载。
正如您在评论中提到的,您必须处理TCP / IP低级API 1 ,我建议您使用std::vector<uint8_t>
进行缓冲,因为您不能确保仅发送有效的单个char
值。
1) 在处理通过有线发送的数据时,请注意机器的字节序中性,特别是在发送和接收数据包大小时。 htonx()
/ ntohx()
函数家族可帮助您正确完成此任务。