删除c ++中的列表

时间:2016-03-03 14:18:05

标签: c++ list dynamic

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

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

我以这种方式创建此列表的每个元素:

new A

我必须在最后删除列表。默认情况下是否会使用类A的析构函数删除它,因为我已经调用B::~B() { int i; A* tmp; cout<<"del list\n"; if (next) { // at least one elem tmp = next; while (tmp->next) { tmp = tmp->next; delete next; cout<<"del elem\n"; next = tmp; } delete tmp; } } (但是我让我的析构函数打印消息,没有它们)或者我应该明确地删除它(I&#39我试过,这是编译中的错误)?求助。

lastrow = lastRowOfRange(range("b2").currentregion)

Function lastRowOfRange(rng As Range)
    Dim adr
    adr = Split(rng.Address, "$")
    lastRowOfRange = adr(UBound(adr))
End Function

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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 set\n";
}

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

谢谢大家!