在 c++ 中删除列表

Delete a list in c++

本文关键字:删除列 列表 删除 c++      更新时间:2023-10-16

我有类A和B类.类B有一个指向类A的指针作为字段,指向一个列表:

 struct A {
      A* next;
      char* txt;
    ...};
struct B {
      A* next;
      int length;
    ...};

我以这种方式制作此列表的每个元素:

void B::add_elem(char* str) {
  A* tmp;
  tmp = new A;
  tmp->txt = str;
  tmp->next = next;
  next = tmp;
}

我必须删除最后的列表。默认情况下会像我所说的 A 类析构函数一样删除它new A(但我让我的析构函数打印消息,没有)还是应该显式删除它(我试过了,这是编译中的错误)?请帮忙。

B::~B() {
  int i;
  A* tmp;
  cout<<"del listn";
  if (next) { // at least one elem                                                                                                    
    tmp = next;
    while (tmp->next) {
      tmp = tmp->next;
      delete next;
      cout<<"del elemn";
      next = tmp;
    }
    delete tmp;
  }
}
使用

new 创建的任何指针的生存期必须由创建者使用匹配的delete手动管理以释放内存。

这意味着每个拥有原始指针的类都必须处理其删除。这通常在析构函数中完成。如果您使用的是 C++11,则可以使用 unique_ptr 而不是管理其自身生命周期的原始指针。这将帮助您摆脱许多错误和内存泄漏,但会为您的设计添加更多约束。在大多数情况下,这些约束是你真正想要的。

为了很好地处理C++内存管理问题,您可以查看 https://isocpp.org/wiki/faq/freestore-mgmt

哦,它有效!事实证明,我忘记为某个字段提供内存,但在析构函数中我想删除它。这是一个复杂的类:一些静态字段和一个动态字段:一个动态的海量,其每个成员都是指向列表的指针。最后,这个析构函数工作:

set::~set() {
  int i;
  elem* tmp;
  for(i=0; i<size; i++) {
    if (table[i].next) { // at least one elem                                                                                         
      tmp = table[i].next;
      while (tmp->next) {
        tmp = tmp->next;
        delete table[i].next;
        table[i].next = tmp;
      }
      delete tmp;
    }
  }
  delete[] table;
  cout<<"del setn";
}
nirvana@lpt00:~/cpp/new$ ./a.out 
new set
new list
new list
new list
new list
new list
new el
new el
del el
del el
del list
del list
del list
del list
del list
del set

谢谢大家!