gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:56:16 25 4
gpt4 key购买 nike

目前我正在编写一些代码来练习我在在线教程中学习的内容。在此代码中,我使用指针使用“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 是任何其他数字时调用。

最佳答案

does a pointer need to be pointing at the first object in an allocated class array to use 'delete [] ptrName'?

是的。

标准说(引用草案):

[expr.new]

When the allocated object is an array (that is, the noptr-new-declarator syntax is used or the new-type-id or type-id denotes an array type), the new-expression yields a pointer to the initial element (if any) of the array. ...

[expr.delete]

... In an array delete expression, the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression. If not, the behavior is undefined. ...

由于 new[] 的结果是初始元素的地址,任何其他同级元素的地址都不是 new[] 的结果,并且因此,在指向任何其他元素的指针上应用 delete[] 会导致未定义的行为。

关于c++ - 指针是否需要指向分配的类数组中的第一个对象才能使用 'delete [] ptrName' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57138534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com