gpt4 book ai didi

c++ - 在接收动态数组或堆对象时,我应该使用 delete 还是 delete[]?

转载 作者:太空狗 更新时间:2023-10-29 23:53:34 26 4
gpt4 key购买 nike

假设我在堆上有两个项目:

Foo *f = new Foo;
Foo *g = new Foo[42];

假设我有一个接收 Foo 的函数指针和函数内它需要执行 delete :

void bar(Foo *p) {
// some stuff
delete p;
}

这个函数可以这样调用:

bar(f); // passing a pointer to a Foo object on the heap
bar(g); // passing a pointer to an array on the heap

我认识到 delete[]delete应该用于释放用 new[] 分配的内存和 new分别;但是,由于该函数不知道其参数是否为 p分配了 newnew[] ,这个功能怎么才能正常deletedelete[]

最佳答案

听起来您对单一职责原则有疑问。

您有一些对单个对象进行操作的处理,因此传递单个对象或数组是合理的。 (为什么该处理对第一个数组元素或非动态对象以外的数组元素也没有用?)

然后你必须释放对象。或者数组。

这里有三个不同的任务,需要三个不同的函数。

本质上,如果“函数不知道它的参数 p 是用 new 还是 new[] 分配的”,那个函数没有试图解除分配的业务。如果参数在栈上怎么办?如果使用池分配器会怎样?

另外,一旦处理被转移到一个单独的函数中,就可以很容易地为“处理然后删除单个对象”和“处理然后删除数组”创建一个函数而不会重复(两者都调用处理组件的辅助函数).

关于c++ - 在接收动态数组或堆对象时,我应该使用 delete 还是 delete[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10260414/

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