Здесь есть утечка памяти? Попытка передать объект через функцию

0

У меня есть следующая функция:

int getNumber( MyObject &obj ) {
    .....
}

Я могу сделать вот так:

MyObject obj; // obj.x = 10; obj.y = 20; ...setting up the object
if ( getNumber( obj ) > 35 ) { // something to do...
}

Но когда я пытаюсь сделать что-то вроде этого:

MyObject getObj() { // i need to return an object here
    MyObject newObj; // setting up the object: newObj.x = .....
    return newObj;
}
if ( getNumber( getObj() ) > 35 ) {...}

Я получаю предупреждение: "Ссылка Non-const lvalue на тип" MyObject "не может связываться с временным типом" MyObject ". Я могу решить это так:

MyObject obj = getObj();
if ( getNumber( obj ) > 35 ) {...}

Но это очень неудобно использовать. Я хочу создать другую функцию и использовать ее так:

int getNumber2( MyObject obj ) {
    MyObject newObj; // now it not a temporary variable I think :)
    return getNumber( newObj );
}
if ( getNumber2( getObj() ) {...}

Здесь проблема утечки памяти? Может быть, есть некоторые интересные способы решения этого предупреждения? :)

  • 0
    Там нет утечки памяти, если вы не удаляете то, что вы выделили с new / new[] . Проблема в том, что вы пытаетесь привязать временную ссылку к неконстантной ссылке.
  • 1
    Вы можете просто заставить getNumber принимать getNumber , я думаю ... при условии, что вам не нужно изменять объект. (А если бы вам пришлось ... тогда не проходит ли временная победа над целью?)
Показать ещё 1 комментарий
Теги:
memory-leaks

1 ответ

2
Лучший ответ

Он сообщает вам, что при вызове getNumber( getObj() ) getNumber не должен позволять изменять объект.

Чтобы исправить это, выполните следующие действия:

int getNumber(const MyObject &obj ) {
  // You code should not modify obj
}

Кстати, утечки памяти нет.

Для вашего int getNumber2( MyObject obj ), я не вижу смысла звонить

int getNumber2( MyObject obj )
{
    MyObject newObj; // now it not a temporary variable I think :)
    return getNumber( newObj );
}

Это означает, что вы не беспокоите MyObject переданный как параметр getNumber(), потому что это не тот, getNumber2 получает getNumber2...

  • 0
    Спасибо за быстрый ответ! Это работает :) Я приму ваш ответ через несколько минут.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню