【问题标题】:How can I avoid double deleting variables in c++?如何避免在 C++ 中重复删除变量?
【发布时间】: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
  • 您的代码无论如何都没有双重删除,inputoutput 指向不同的缓冲区。 test内的同名局部变量不影响函数外的变量。
  • @DrewDormann 在那个答案中,它描述了使用堆栈而不是堆。我使用new 将空白数组传递给结构(内联)的初始化列表。有没有办法使用初始化列表语法获得一个新的基于堆栈的数组?还是我应该只声明一个变量?
  • “将一个空白数组传递给一个结构体的初始化列表(内联)”——嗯?发布您尝试描述的代码会有所帮助。

标签: c++ memory-management delete-operator


【解决方案1】:

一般来说,避免双重删除的最佳方法是不直接使用new 分配内存。您可以使用各种智能指针,例如scoped_ptrshared_ptr,在您的情况下,您可以使用std::Vector

typedef std::vector<int> Ints;

void test(const Ints& input, Ints& output)
{
  if(input[0] == 0) {
    output = input;
  }
}

Ints input(3);
Ints output(3);

input[0] = 0;

test(input, output);

【讨论】:

  • input[0] = 0; 和以下行需要在函数中
【解决方案2】:

避免双重删除的方法是设计您的代码,以便明确定义对象的所有权。一次只能有一个对象的所有者,尽管所有权可以从一个拥有实体传递给另一个。对象所有者可以是一段代码(如函数)或数据结构。当所有者处理完一个对象后,所有者有责任将所有权传递给其他对象或销毁该对象。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2023-03-08
    • 2018-09-30
    • 2015-07-21
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多