关于类内指针的问题

rud*_*tti 3 c++ null pointers class

考虑这个课程:

class Packet {
public:
  Packet();
  ~Packet();
  void allocateBuffer(unsigned int size);
  void deallocateBuffer();
  char* getBuffer() const;
private:
  char* buffer;
};
Run Code Online (Sandbox Code Playgroud)

使用以下方法:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是一些问题:

  1. 因为在C指针中NULL它们是否相等,如果它们指向什么,上面列出的实现是否是处理类内指针的好方法?我要求这样做,因为如果buffer变量未在构造函数中初始化,\v则默认情况下似乎会为其分配一个奇怪的值.
  2. 如果没有,你能建议更优雅的方法吗?

πάν*_*ῥεῖ 6

  1. 因为在C指针中如果它们指向什么都不等于NULL,上面列出的实现是否是处理类内指针的好方法?我要求这样做,因为如果缓冲区变量没有在构造函数中初始化,默认情况下似乎会为它分配一个奇怪的\ v值.

您应该始终在类构造函数中处理非静态成员变量的初始化,除非这些是非基本类型,并且这些变量本身会处理它们的初始化.
访问它们会暴露未定义的行为.

您应该注意,非静态类成员变量没有默认初始化.

使用c ++也应该使用nullptr而不是NULL初始化原始指针.

  1. 如果没有,你能建议更优雅的方法吗?

当然,只需使用一个std::vector<char>成员变量,它将自动为您执行所有分配/释放内存管理.

要通过原始指针访问原始数据,请使用std::vector::data()函数重载.

正如您在评论中提到的,您必须处理TCP/IP低级API 1,我建议您使用a std::vector<uint8_t>进行缓冲,因为您无法确定是否只会char传输有效的已识别值.


1)处理通过线路发送的数据时,请注意机器端点中立性,尤其是在发送和接收数据包大小时.该htonx()/ntohx()函数族就派上用场了正确做到这一点.