【发布时间】:2023-03-06 11:09:01
【问题描述】:
我读过here 以及其他地方,两次删除同一个变量可能是灾难性的(即使有多个变量名)。
假设我有一个接受输入和输出数组的函数:
void test(int*& input, int*& output) {
if(input[0] == 0) {
output = input;
}
}
它可能会为我正在使用的另一个变量分配一个指针:
int *input = new int[3];
int *output = new int[3];
input[0] = 0;
test(input, output);
delete[] input;
delete[] output;
如何避免重复删除?
在这个过于简化的场景中,我知道我可以检查指针地址以查看它们是否相等并有条件地只删除其中一个,但是当我不知道指针可能指向同一个地址时,是否有更好的解决方案内存?
编辑:
整理了一些东西以避免一些混乱..
【问题讨论】:
-
“我怎样才能避免双重删除?” 这不是刻薄的,所以不要这样读 - don't use
new。 -
也不要使用
delete -
您的代码无论如何都没有双重删除,
input和output指向不同的缓冲区。test内的同名局部变量不影响函数外的变量。 -
@DrewDormann 在那个答案中,它描述了使用堆栈而不是堆。我使用
new将空白数组传递给结构(内联)的初始化列表。有没有办法使用初始化列表语法获得一个新的基于堆栈的数组?还是我应该只声明一个变量? -
“将一个空白数组传递给一个结构体的初始化列表(内联)”——嗯?发布您尝试描述的代码会有所帮助。
标签: c++ memory-management delete-operator