首页 > 解决方案 > 指针是否需要指向分配的类数组中的第一个对象才能使用'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 是任何其他数字时不会调用。

标签: c++

解决方案


指针是否需要指向分配的类数组中的第一个对象才能使用'delete [] ptrName'?

是的。

该标准说(引用草案):

[expr.new]

当分配的对象是一个数组(即使用 noptr-new-declarator 语法或 new-type-id 或 type-id 表示数组类型)时,new-expression 产生一个指向初始元素的指针(如果任何)的数组。...

[expr.delete]

... 在数组删除表达式中,delete 的操作数的值可能是空指针值或由前一个数组 new 表达式产生的指针值。如果不是,则行为未定义。...

由于结果new[]是初始元素的地址,因此任何其他兄弟元素的地址都不是 a 的结果new[],因此将delete[]指针应用于任何其他元素会导致未定义的行为。


推荐阅读