【问题标题】:Questions about pointers inside classes关于类内部指针的问题
【发布时间】:2019-02-03 18:18:45
【问题描述】:

考虑这个类:

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】:
  1. 因为在 C 中,如果指针不指向任何内容,它们就等于 NULL,那么上面列出的实现是处理类内部指针的好方法吗?我要求这样做是因为如果缓冲区变量未在构造函数中初始化,默认情况下似乎会为其分配一个奇怪的 \v 值。

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

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

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

  1. 如果没有,您能提出更优雅的方法吗?

当然,只需使用std::vector&lt;char&gt; 成员变量,它会自动为您完成所有分配/释放内存管理。

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

正如您在 cmets 中提到的,您必须处理 TCP/IP 低级 API1,我建议您使用 std::vector&lt;uint8_t&gt; 进行缓冲,因为您无法确定只会传输有效的签名char 值。


1)在处理通过网络发送的数据时,请注意机器字节序中立性,尤其是在发送和接收数据包大小时。 htonx() / ntohx() 函数族可以派上用场正确地做到这一点。

【讨论】:

  • 正如我在对问题的评论中介绍的那样,我尝试实现的缓冲区可能包含不同类型的数据;这是一个简短的表示:|--ushort--||--uint--||--double--|[...]|--double--|。我怎样才能用std::vector 做到这一点?真诚地,我在想这样的事情:codepile.net/pile/ZKLj4NlA 这个代码快照怎么样?有没有更优雅的方式来做同样的事情?
  • @rudicangiotti 您可以使用std::vector&lt;uint8_t&gt; 执行此操作,就像您计划使用char* 缓冲区执行此操作一样。 std::vector 可以让您免于笨拙的手动内存管理。至于其他类型的演员表,不会有任何区别。我本质上是说:不要自己做内存管理,这很容易出错,你不会开心。
猜你喜欢
  • 2014-05-13
  • 2011-12-09
  • 2015-09-27
  • 2023-01-08
  • 2013-11-22
  • 2020-08-25
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多