Я пытаюсь отладить программу, которая, кажется, имеет проблемы с передачей указателя. У меня есть класс, определенный как ниже:
class data{
public:
data(int x, int y){
a=x;
b=y;
md = new metadata();
}
~data(){
delete md;
}
int a;
int b;
metadata* md; //metadata is another class
};
и несколько функций, которые получают указатель на объект данных:
void function1(data* d){
//do stuff
}
void function2(data* d){
//do stuff
function1(d);
}
void function3(data* d){
//do stuff
function2(d);
}
int main(){
//stuff
data* data = new data(1,2);
function3(d);
//other stuff
}
У меня установлена точка останова в function1
и один в function3
, где-то между этими двумя точками останова, md
переназначается для указания на другой объект метаданных (d
Тем не менее, все еще указывает на тот же адрес памяти). Между двумя контрольными точками выполняются тысячи строк, поэтому просто невозможно просто пройти через них, поэтому я хочу смотреть и прерывать, когда md
указатель изменен тем не мение, watch d->md
для перерыва в function1
не работает, так как я получаю сообщение о том,
Watchpoint 1 deleted because the program has left the block in which its expression is valid
что предположительно происходит потому, что в d
является локальным для контекста функции. Есть ли способ посмотреть адрес памяти, по которому md
указатель хранится, чтобы увидеть, когда он будет изменен (т.е. когда md
переназначается) и сломаться там?
Получить адрес d->md
с помощью print d->md
и смотреть выражение *((metadata *)0x....)
вместо использования имени d
,
Других решений пока нет …