关于内部类的指针问题

问题描述 投票:3回答:1

考虑到这一类:

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. 如果没有,你可以提出更优雅的方式来做到这一点?
c++ class pointers null
1个回答
6
投票
  1. 因为在C指针等于NULL,如果它们指向什么,是上面列出实现良好的方式来处理内部类的指针?我问这个,因为如果缓冲区变量未初始化构造函数,一个奇怪的\ V值似乎被默认分配给它。

你应该总是照顾非静态成员变量的初始化在类的构造函数,除非这些都是非基本类型,这些照顾自己初始化自己。 访问他们原本暴露未定义行为。

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

也与C ++,你应该使用nullptr而不是NULL初始化原始指针。

  1. 如果没有,你可以提出更优雅的方式来做到这一点?

当然,简单地用一个std::vector<char>成员变量,它会为你自动完成所有的分配/释放内存管理。

由原始指针来访问原始数据使用std::vector::data()函数重载。

正如你在你不得不处理TCP / IP低水平API1意见所提到的,我建议你使用std::vector<uint8_t>的缓冲,因为你不能确保只有有效singned char值将被传输。


1)当与通过线路发送数据的发送和接收的数据包大小处理时,照顾机字节序中立,更是如此。该htonx() / ntohx()函数族就派上用场了正确做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.