c++ - 指针是否需要指向分配的类数组中的第一个对象才能使用'delete [] ptrName'?
问题描述
目前我正在编写一些代码来练习我在在线教程中学习的内容。在这段代码中,我使用“new”使用指针分配了一些空间来创建类实例,并遍历它们以设置它们的名称。但是,我只能在指针位于第 0 位时删除它们。有人可以解释我是否错误地考虑了这一点或一般规则是什么?
//头文件
#include <iostream>
using namespace std;
class Animal {
private:
string name;
int age;
public:
Animal(string name = "UNDEFINED", int age = 0): name(name), age(age) {cout << "Animal created" << endl;}
~Animal() {cout << "Animal killed" << endl;}
void setName(char name) {this->name = name;}
void speak() {cout << "My name is: " << name << ", and my age is: " << age << endl;}
};
//主文件
#include "Animal.h"
int main() {
char name = 'a';
Animal *animals = new Animal[10];
for (int i = 0; i < 10; i++, animals++, name++) {
animals->setName(name);
animals->speak();
}
animals -= 10;
delete[] animals;
return 0;
}
仅当包含 'animals -= 10' 行时才调用解构器,但在省略它或 10 是任何其他数字时不会调用。
解决方案
指针是否需要指向分配的类数组中的第一个对象才能使用'delete [] ptrName'?
是的。
该标准说(引用草案):
[expr.new]
当分配的对象是一个数组(即使用 noptr-new-declarator 语法或 new-type-id 或 type-id 表示数组类型)时,new-expression 产生一个指向初始元素的指针(如果任何)的数组。...
[expr.delete]
... 在数组删除表达式中,delete 的操作数的值可能是空指针值或由前一个数组 new 表达式产生的指针值。如果不是,则行为未定义。...
由于结果new[]
是初始元素的地址,因此任何其他兄弟元素的地址都不是 a 的结果new[]
,因此将delete[]
指针应用于任何其他元素会导致未定义的行为。
推荐阅读
- python - Python Excel COM 互操作:强制无头模式并阻止用户输入
- javascript - 如何在 codeigniter 中生成此代码 mysql_fetch_array
- tsql - 从联接中获取公共记录
- java - 从基本时间间隔中减去一个间隔后如何获取剩余间隔列表
- sql-server - 检索选定列的数据类型
- angular - 角度测试私有方法
- visual-studio - 打开我的项目 exe 后缺少 mfc120d.dll
- powershell - 抑制 powershell 中的错误并显示自定义错误消息
- wordpress - 外观菜单 - 将新项目添加到菜单顶部
- audio - 如何用ffmpeg覆盖两个音频?