2

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

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 那样交换。只是 first 变成了 second ,而 second 变成了一个新的对象或指向一个对象的新指针。

第二 = 下一个。

解决方案

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

4 回答 4

3

是的,有,但你错过了一些东西。当您传递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

我希望这会有所帮助。

于 2012-08-21T20:52:23.660 回答
2

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

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

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

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

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

此外,要交换,您只需使用std::swap. 不要重新发明轮子。

于 2012-08-21T20:50:50.573 回答
1

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

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

顺便说一句,不要将诸如“swap”之类的知名名称的含义更改为涉及删除和新建的任意交换。交换意味着它的意思。如果你想要一个花哨的操作来完成你花哨的分配/删除/新建,请将其命名为别的。

它应该首先与第二个交换并在第二个创建一个“someObject”的新实例,

无论您如何切片,这都不是交换。我将其称为“Shift”,但我们将其称为 MyOperation:

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

请注意 temp 是如何预先分配的,因为它最有可能抛出,并且您希望在发生异常时将事物保持在连贯状态。删除和简单的指针赋值不能抛出。

于 2012-08-21T20:53:04.217 回答
1

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

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

    a = b;
    b = x;
}

但是,您可以轻松地使用std::swap它;它会有效地做这个模板函数所做的同样的事情。

于 2012-08-21T20:53:57.947 回答