有关类内部指针的问题

时间:2019-02-03 18:18:46

标签: c++ class pointers null

考虑此类:

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
  }
}

以下是一些问题:

  1. 由于C指针如果指向空,则等于NULL,因此上面列出的实现是处理类内部指针的好方法吗?我之所以这样问是因为,如果buffer变量没有在构造函数中初始化,默认情况下似乎会为其分配一个奇怪的\v值。
  2. 如果不是,您能建议更优雅的方法吗?

1 个答案:

答案 0 :(得分:6)

  
      
  1. 由于C指针如果不指向任何内容,则等于NULL,因此上面列出的实现是处理类内部指针的好方法吗?我之所以这样问,是因为如果未在构造函数中初始化缓冲区变量,则默认情况下似乎会为其分配一个奇怪的\ v值。
  2.   

您应该始终注意在类构造函数中初始化非静态成员变量,除非它们是非原始类型,并且它们自己负责初始化。
否则,访问它们将暴露未定义的行为

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

另外,对于c ++,您应该使用nullptr而不是NULL来初始化原始指针。

  
      
  1. 如果不是,您能建议更优雅的方法吗?
  2.   

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

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

正如您在评论中提到的,您必须处理TCP / IP低级API 1 ,我建议您使用std::vector<uint8_t>进行缓冲,因为您不能确保仅发送有效的单个char值。


1) 在处理通过有线发送的数据时,请注意机器的字节序中性,特别是在发送和接收数据包大小时。 htonx() / ntohx()函数家族可帮助您正确完成此任务。