@pixik

Почему при передаче указателя на структуру присвоенное значение в функции сбрасывается?

Либо глаз замылился, либо с пониманием чего то не то.
Есть 2 указателя на SYSTEMTIME:
...
SYSTEMTIME * minDate = new SYSTEMTIME();
SYSTEMTIME * maxDate = new SYSTEMTIME();
this->someFunc(minDate, maxDate);
...

Описание функции someFunc:
void someFunc(SYSTEMTIME * _minDate, SYSTEMTIME * _maxDate);

Реализация someFunc:
void SomeClass::someFunc(SYSTEMTIME * _minDate, SYSTEMTIME * _maxDate){
	SYSTEMTIME minDate, maxDate;
	std::vector<SYSTEMTIME> dates;
	...
		minDate = dates[0]; // тут все хорошо. Новые значения присвоены
		maxDate = dates[1];
	...
	_minDate = new SYSTEMTIME(minDate); // _minDate  присвоен указатель на новый объект.
	_maxDate = new SYSTEMTIME(maxDate); // проветил, _minDate  и _maxDate дейсвтиетльно какие нужно.
}


После выполнения someFunc, если дебаггером посмотреть на следующую строку, то я вижу инициализированные значения, т.е.
...
SYSTEMTIME * minDate = new SYSTEMTIME();
SYSTEMTIME * maxDate = new SYSTEMTIME();
this->someFunc(minDate, maxDate);
... //по адресу minDate, maxDate - нули. Как будто они не изменились.

Впервые сталкиваюсь с такой аномалией, и уже идей никаких нету, кроме костылей...
Спасибо всем!
  • Вопрос задан
  • 2585 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
А зачем вы в SomeClass::someFunc меняете значения указателей (локальные для функции), вместо того, чтобы менять значения, на которые они указывают? Типа того:
void SomeClass::someFunc(SYSTEMTIME * _minDate, SYSTEMTIME * _maxDate){
  SYSTEMTIME minDate, maxDate;
  std::vector<SYSTEMTIME> dates;
  ...
    minDate = dates[0]; // тут все хорошо. Новые значения присвоены
    maxDate = dates[1];
  ...
  *_minDate = minDate;
  *_maxDate = maxDate;
}

Ну, или если уж необходимо действительно указатели менять, то, например, так:
void SomeClass::someFunc(SYSTEMTIME * & _minDate, SYSTEMTIME * & _maxDate){
  SYSTEMTIME minDate, maxDate;
  std::vector<SYSTEMTIME> dates;
  ...
    minDate = dates[0]; // тут все хорошо. Новые значения присвоены
    maxDate = dates[1];
  ...
  // что-то сделать с объектами, на которые указывают _minDate и _maxDate, например освободить
  _minDate = new SYSTEMTIME(minDate); // _minDate  присвоен указатель на новый объект.
  _maxDate = new SYSTEMTIME(maxDate); // проветил, _minDate  и _maxDate дейсвтиетльно какие нужно.
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
donkaban
@donkaban
Умею рисовать тени
1. Вы течете по памяти как драное решето. Зачем вообще создавать экземпляры объектов в куче перед вызовом метода, который делает то же самое, создает ДРУГИЕ экземпляры. Указатель вы потеряли, объекты созданные в методе после выхода остались в куче, грустные и одинокие.
Почему не написать (раз уж вы передаете указатели и у вас есть перегруженный =)
void SomeClass::someFunc(SYSTEMTIME * _minDate, SYSTEMTIME * _maxDate){
  std::vector<SYSTEMTIME> dates;
  ...
    *_minDate = dates[0]; 
    *_maxDate = dates[1];
  ...

Либо не создавать экземпляры снаружи, ибо они реально создаются (в том, что вы показали) внутри метода.

2. Вы передаете указатели ПО ЗНАЧЕНИЮ. То есть копируете. С чего вы думаете, что они изменятся ВНЕ метода? Если очень хочется, передавайте **

3. https://ideone.com/YhbnBn
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы