Я слышал, что проблема с оборванным указателем возникает, когда мы назначаем один и тот же адрес двум разным указателям. Это связано с тем, что оба указателя указывают на одно и то же место в памяти, и если память освобождается с использованием адреса в одном указателе; он по-прежнему может быть доступен из второго указателя (или даже из первого указателя, если не установлено значение null, я не обсуждаю этот случай).
В следующем коде я пробовал разные сценарии, в которых одно и то же место в памяти должно быть назначено разным указателям, но, по-видимому, в каждом сценарии выделяется новая память. Почему это так? В каждом случае создаются глубокие копии.
#include<iostream>
using namespace std;
class Player
{
public:
char * name;
char * countryName;
char * gameName;
int age;
Player()
{
}
Player(char * n, char * c, char * g,int a)
{
name=n;
countryName=c;
gameName=g;
age=a;
}
};
void printAddresses(Player p,Player p3)
{
cout<<endl<<&p3<<endl<<&p<<endl;
cout<<endl<<&p3.name<<endl<<&p.name<<endl;
cout<<endl<<&p3.countryName<<endl<<&p.countryName<<endl;
cout<<endl<<&p3.gameName<<endl<<&p.gameName<<endl;
cout<<endl<<&p3.age<<endl<<&p.age<<endl;
}
int main()
{
Player *p2=new Player;
Player *p4=p2;
// p2 is a pointer and p4 is also a pointer initialized from p2. But the following function prints the memory addresses, and it shows that both objects have different memory addresses. And data members also have different memory locations
printAddresses(*p4,*p2);
return 0;
}
Я также пробовал много сценариев для инициализации указателей. Но в каждом случае оказывается, что у них разные адреса памяти, а также у соответствующих элементов данных разные адреса памяти.
Итак, в каком случае здесь может возникнуть проблема с оборванным указателем? ИЛИ как я могу сделать неглубокую копию здесь? Этот стандарт/версия С++ (написанная ниже) ведет себя так, или я что-то упустил?
ОС: линукс 15 мин.
Вывод g++ --version:
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
&p
и&p3
имеют свои адреса.printAdresses(Player *p, Player *p3) { cout << p3 << p << endl; ...
и вызов, какprintAddresses(p4, p2)
, должен сделать это. - person user1810087   schedule 21.10.2013