如何避免在 C++ 中重复删除变量?
How can I avoid double deleting variables in c++?
我读过 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;
如何避免重复删除?
在这个过于简化的场景中,我知道我可以检查指针地址以查看它们是否相等并有条件地只删除其中一个,但是当我不知道指针可能指向时有没有更好的解决方案相同的内存?
编辑:
整理了一些东西以避免一些混乱..
一般来说,避免重复删除的最好方法是不直接使用new
分配内存。您可以使用各种智能指针,例如 scoped_ptr
和 shared_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);
避免双重删除的方法是设计您的代码,以便明确定义对象的所有权。一次只能有一个对象的所有者,尽管所有权可以从一个拥有实体传递给另一个实体。对象所有者可以是一段代码(例如函数)或数据结构。当所有者用完某个对象时,所有者有责任将所有权传递给其他对象或销毁该对象。
我读过 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;
如何避免重复删除?
在这个过于简化的场景中,我知道我可以检查指针地址以查看它们是否相等并有条件地只删除其中一个,但是当我不知道指针可能指向时有没有更好的解决方案相同的内存?
编辑:
整理了一些东西以避免一些混乱..
一般来说,避免重复删除的最好方法是不直接使用new
分配内存。您可以使用各种智能指针,例如 scoped_ptr
和 shared_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);
避免双重删除的方法是设计您的代码,以便明确定义对象的所有权。一次只能有一个对象的所有者,尽管所有权可以从一个拥有实体传递给另一个实体。对象所有者可以是一段代码(例如函数)或数据结构。当所有者用完某个对象时,所有者有责任将所有权传递给其他对象或销毁该对象。