【问题标题】:Deleting a pointer which contains a pointer pointing to another location删除包含指向另一个位置的指针的指针
【发布时间】:2020-07-02 21:23:12
【问题描述】:

最近,当我为 Stack 实现编写代码时。我遇到了这个疑问。请帮助我度过难关。代码如下所示。

struct Stack{
  int top;
  int capacity;
  int *array;
}

Stack* createStack(int capacity){
  Stack *S = new Stack;

  S->capacity = capacity;
  S->top = -1;
  S->array = new int[capacity];

  return S;
}

void Delete(Stack *S){
  delete S->array;
  delete S;
}

现在我的疑问在于删除功能。正如我们所见,S 指向的是 Stack 类型的内存块。在其中还有另一个指针指向 int 类型的块数组。 不删除数组块直接删除S块会怎样?

【问题讨论】:

  • 您会发生内存泄漏,如果您继续这样做,您将耗尽内存。这就是你要找的答案吗?顺便提一句。您的代码具有未定义的行为,因为您在由数组 new 表达式分配的指针上使用了 delete。您必须改用delete[]
  • 这就是为什么类(包括标记为struct的东西)有析构函数。 ~Stack() 应该删除 array。但是Stack 也需要构造函数和成员函数。这段代码是用 C++ 编写的 C,即两全其美。

标签: c++ pointers data-structures stack c++14


【解决方案1】:

不删除数组块直接删除S块会怎样?

S 对象将被销毁,该内存将被释放。不会有其他事情发生。特别是array指向的内存不会被释放。如果该成员是指向该内存的唯一指针,那么就不可能释放它。这称为内存泄漏。

附:如果在new 未返回的指针上使用delete,则程序的行为未定义。在示例程序中,delete 用于new[] 返回的指针。程序的行为是未定义的。必须改用delete[]

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多