C++ 删除C+中的函数+;

C++ 删除C+中的函数+;,c++,arrays,delete-operator,C++,Arrays,Delete Operator,我在cpp中看到了一个使用函数delete的例子,但我并不完全理解它。 代码是: 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 我认为目

我在cpp中看到了一个使用函数delete的例子,但我并不完全理解它。 代码是:

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的指针数组,但数组的大小没有指定,那么析构函数如何“知道”要删除多少指针呢?

delete
不是一个函数,而是一个运算符

使用
[]
删除
表达式将销毁使用
新建创建的对象。。。[]
并释放相关内存<代码>删除[]
必须用于
新建返回的指针。。。[]
;非数组
delete
仅对非数组
new
返回的指针执行。使用不匹配的
delete
表单总是不正确的

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

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


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

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

因为C++语言标准规定它必须知道。 因此,当您分配数组时,由系统将大小存储在

delete[]
可以找到它的地方

一种选择是分配比所需多几个字节。使用第一个字节指定大小,然后返回指向第一个字节的指针,而不是返回指向第一个已分配字节的指针,该指针指向超出大小字段的第一个字节

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


另一个选项是使用全局
映射
,其中键是指向内存分配的指针,值是该分配的大小。
delete[]
还有很多其他方法可以找到大小。C++标准没有指定使用哪一个。它只是说,
delete[]
必须知道大小,并让实现者自己决定如何实现。

可能的重复和“所有指针”-请注意,
只包含一个指针。它是指向动态分配的
名称
数组的指针,但只有一个动态创建的对象(数组)需要解除分配。1)在代码中,许多对象可以用新的…[]初始化。删除会销毁哪些对象?2) 在示例中,代码()也丢失了。@Day\u Dreamer:另一种方法是将它看作是多个对象的单个数组
newname[sz]
分配一个数组(多个对象)
delete[]
取消分配一个数组(多个对象)。当数组被销毁时,数组的每个成员都会被销毁。该对机制的实现在哪里:delete和new?在运行时库中,该库通常随编译器提供。