考虑到这一类:
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
价值似乎被默认分配给它。
- 因为在C指针等于NULL,如果它们指向什么,是上面列出实现良好的方式来处理内部类的指针?我问这个,因为如果缓冲区变量未初始化构造函数,一个奇怪的\ V值似乎被默认分配给它。
你应该总是照顾非静态成员变量的初始化在类的构造函数,除非这些都是非基本类型,这些照顾自己初始化自己。 访问他们原本暴露未定义行为。
你应该注意到,有非静态类成员变量没有默认初始化。
也与C ++,你应该使用nullptr
而不是NULL
初始化原始指针。
- 如果没有,你可以提出更优雅的方式来做到这一点?
当然,简单地用一个std::vector<char>
成员变量,它会为你自动完成所有的分配/释放内存管理。
由原始指针来访问原始数据使用std::vector::data()
函数重载。
正如你在你不得不处理TCP / IP低水平API1意见所提到的,我建议你使用std::vector<uint8_t>
的缓冲,因为你不能确保只有有效singned char
值将被传输。
1)当与通过线路发送数据的发送和接收的数据包大小处理时,照顾机字节序中立,更是如此。该htonx()
/ ntohx()
函数族就派上用场了正确做到这一点。