交换指针,删除第二个对象并创建指向第二个的新指针
Swaping pointers, deleting second object and create new pointer to second
我试图交换一个指针,但我得到的只是访问错误,有什么方法可以做到这一点吗?
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是如何预分配的,因为它最有可能抛出,并且您希望在出现异常时保持一致状态。删除和简单指针分配不能引发。
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 将第二个 GATT 服务添加到 Movesense 容器
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 使第二个类的构造函数成为第一个类中的友元函数
- 复制列表并返回指向第二个列表的指针
- 访问MAP中的第二个元素,这是对象指针
- 指向功能和std ::功能:第一个编译而不是第二个指针
- 交换指针,删除第二个对象并创建指向第二个的新指针
- 将第二个指针分配给第一个指针指向的对象
- 分割 使用指针访问 obj 向量中的第二个元素时出错
- 递归可变参数模板函数调用第二个参数类型的指针"loses"指针
- 将内存分配给一个指针,将另一个指针指向同一个指针,并删除第二个指针
- 为什么指向Object的第二个指针没有设置为NULL,而是设置为Object指针