【问题标题】:delete function in C++C++中的删除函数
【发布时间】:2010-08-07 12:39:15
【问题描述】:

我看到一个使用函数的例子:在cpp中删除,我没有完全理解。 代码是:

class Name {
    const char* s;
    //...
};

class Table {
      Name* p;
      size_t sz;
public:
      Table(size_t s = 15){p = new Name[sz = s]; }
      ~Table { delete[] p; }
};

命令的具体操作是什么:delete[] p;

我认为目的是删除容器表中的所有指针。

delete[] 中的括号给我一个线索,它删除了指向 Name 的指针数组,但未指定数组的大小,那么析构函数如何“知道”要删除多少个指针?

【问题讨论】:

标签: c++ arrays delete-operator


【解决方案1】:

delete 不是函数,而是运算符。

使用[]delete 表达式会破坏使用new ... [] 创建的对象并释放相关的内存。 delete[]必须用于new ... []返回的指针;非数组delete 仅在非数组new 返回的指针上。使用不匹配的delete 形式总是不正确的。

~Table() 中的delete 表达式(您的代码中缺少())将破坏动态创建的Name 对象数组,确保为数组的每个成员调用Name 析构函数。

实现一些机制来记录分配给new ... []的数组中的元素数量,程序员不必担心这一点。

在许多实现中,数组元素具有重要的析构函数,new[] 表达式将分配额外的空间来记录所有数组成员空间之前的元素计数。然后在使用 delete[] 以确保调用正确数量的析构函数时查找此隐藏计数。这只是一个实现细节,不过,其他实现也是可能的。

【讨论】:

  • 1) 在代码中,许多对象可以用 new...[] 来初始化,其中哪些会被 delete 销毁? 2)示例代码中的()也丢失了。
  • @Day_Dreamer:另一种看待它的方式是将其视为许多对象的单个数组。 new Name[sz] 分配一个数组(包含许多对象)delete[] 释放一个数组(包含许多对象)。当数组被销毁时,数组的每个成员都会被销毁。
【解决方案2】:

简而言之,delete[] 知道它正在删除的数组的大小,因为它是必需的。

因为 C++ 语言标准规定它必须知道。 因此,当您分配一个数组时,系统会将大小存储在delete[] 可以找到的位置。

一种选择是多分配几个字节。使用第一个字节来指定大小,而不是返回指向第一个分配字节的指针,而是返回一个指向 size 字段后第一个字节的指针。

然后delete[] 只需从指针中减去几个字节即可找到大小。

另一种选择可能是拥有一个全局map<void*, int>,其中键是指向内存分配的指针,值是该分配的大小。 delete[] 可以通过许多其他方法找出大小。 C++ 标准没有指定使用哪一个。它只是说delete[] 必须知道大小,并将其留给实施者来弄清楚如何 将其拉下来。

【讨论】:

  • pair:delete和new的机制实现在哪里?
  • 在运行时库中,通常由编译器提供。
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多