交换指针,删除第二个对象并创建指向第二个的新指针

Swaping pointers, deleting second object and create new pointer to second

本文关键字:第二个 指针 新指针 创建 删除 对象 交换      更新时间:2023-10-16

我试图交换一个指针,但我得到的只是访问错误,有什么方法可以做到这一点吗?

void Swap(someObject *first, someObject *next)
{
     delete first;
     first = next;
     // I'm guessing this delete first pointer as well ?
     delete next;
     next = new someObject();
};

方法说明:它应该只交换第一个和第二个,并在第二个上创建一个"someObject"的新实例,它不应该像=first=second,second=first那样交换。第一个变为第二个,第二个变为新对象或指向对象的新指针。

第二个=下一个。

解决方案

void Swap(someObject*& first, someObject*& next)
{
    std::swap(first, next);
    next = new someObject();
};

是的,有,但您缺少了一些东西。当您传递someObject *first时,会发生的情况是,在您的函数中,有一个您传递的指针的副本,名为first。因此,如果更改first的值,则会更改局部变量的值,并且它不会传播到原始变量。

您需要做的是通过这种方式传递对指针的引用:

void Swap(someObject*& first, someObject*& second)
{
     delete first;    // Will delete whatever first points to
     first = second;
     delete second;   // first will now point to a deallocated object, you'd better set first = nullptr
     second = new someObject();    // Will really set second to something new
};

如果只需要交换两个指针,还可以使用标准库实用程序函数std::swap

我希望这能有所帮助。

在特定的代码段中不应该有任何访问错误,但您确实删除了这两个内存位置。

请注意,在函数之外,两个指针都将悬空,因为您不是在修改它们,而是在复制它们。

为了使修改在函数之外持久化,您需要通过引用传递指针。

void Swap(someObject*& first, someObject*& second)

调用此版本后,second将指向一个有效位置,first不会(因为您删除了内存,并且从未重新分配指针)。

此外,要进行交换,只需使用std::swap即可。不要重新发明轮子。

试试这个交换习惯用法。您的修改了参数(并删除了这两个对象),但实际上并没有在调用站点交换指针值。

template <typename T>
void Swap(T & a, T & b)
{
    T x = a;
    a = b;
    b = x;
}

然而,您可以很容易地使用std::swap;它将有效地执行与此模板函数相同的操作。

这肯定会导致访问错误,因为您最多只能交换指针的本地副本。传入的参数必须是对指针的引用

void Swap(someObject*& first, someObject*& second)
{
   someObject* temp = first;
   first = second;
   second = temp;
};

顺便说一句,不要把"swap"这样的众所周知的名字的含义改为一些涉及删除和新建的任意交换。互换意味着什么。如果你想要一个能完成你的花式分配/删除/新建的花式操作,那就另起炉灶吧。

它应该只交换第一个和第二个,并创建"someObject"位于第二位,

无论你如何切片,这都不是Swap。我称之为"Shift",但我们只称之为MyOperation:

void MyOperation(someObject*& first, someObject*& second)
{
   someObject* temp = new someObject;
   delete first;
   first = second;
   second = temp;
};

注意temp是如何预分配的,因为它最有可能抛出,并且您希望在出现异常时保持一致状态。删除和简单指针分配不能引发。

相关文章: