我想知道当您一次只能访问一对时,C ++中是否有一种方法可以使多个指针彼此相等。
void point_to_same_location(int*& pt1, int*& pt2) {
// fucntion goes here
}
int* pt1;
int* pt2;
int* pt3;
point_to_same_loaction(pt1, pt2);
point_to_same_location(pt2, pt3);
我可以在函数主体中放入什么以便pt1 = pt2 = pt3
?
编辑:我正在寻找一种避免使用pt2 = pt1
的方法答案 0 :(得分:0)
如果您想避免使用pt1 = pt2;
,可以像这样使用std::memcpy
:
#include <iostream>
#include <cstring>
void point_to_same_location(int*& pt1, int*& pt2) {
std::memcpy(&pt1, &pt2, sizeof(pt1));
}
int main() {
int* pt1;
int* pt2;
int* pt3;
int a = 10;
pt2 = &a;
std::cout << pt2 << std::endl;
point_to_same_location(pt1, pt2);
std::cout << pt1 << std::endl;
point_to_same_location(pt3, pt2);
std::cout << pt3 << std::endl;
return 0;
}
答案 1 :(得分:0)
我认为您想做的事很奇怪,但是无论如何。
请注意,创建指针时,应始终初始化指向nullptr
的指针。这比让他们指向内存中的某个地方要安全得多。并且它可以让您检查指针是否已经分配。
如果要让两个指针指向相同的位置,则它们必须相等。因此,如果没有ptr1 = ptr2;
,您就无法避免。
执行此操作的方法可能是:
bool point_to_the_same_location(int *& ptr1, int *& ptr2)
{
if(ptr1 != ptr2)
{
if(ptr1 == nullptr) // try to affect ptr2 to ptr1
{
ptr1 = ptr2;
return true; // success
}
if(ptr2 == nullptr) // try to affect ptr1 to ptr2
{
ptr2 = ptr1;
return true; //success
}
// At this point both ptr1 and ptr2 != nullptr
return false; // Both ptr1 and ptr2 are already pointing a different value, you need to release one of them.
}
else
return true; // ptr1 already equals ptr2
}
如您所见,如果ptr1
和ptr2
都已经指向了不同的值,则无法使它们指向相同的位置。如果这样做,将会丢失将要更改的值的先前值,并且会造成内存泄漏。
为避免这种情况,您可以说在影响新值之前先删除指针,但是如何知道您是否必须使用delete
或delete []
?实际上,从函数内部,您无法知道指针是指向单个值还是指向数组的第一个元素。因此,如果两个指针都已经指向某处,则不能使它们从函数内部指向同一位置。
另一件事,使用std::shared_ptr
可能比使用原始指针完成您想做的事更好。
希望它能对您有所帮助。