Подтвердить что ты не робот

С++ - функция, возвращающая объект

// Assume class definition for Cat is here.

Cat makeCat() {
    Cat lady = new Cat("fluffy");
    return lady;
}

int main (...) {
    Cat molly = makeCat();
    molly->eatFood(); 
    return 0;
}

Будет ли использование после бесплатной " ошибки на molly->eatFood()?

4b9b3361

Ответ 1

Исправлена ​​ваша программа и была создана пример реализации class Cat:

#include <iostream>
#include <string>

class Cat {
public:
        Cat(const std::string& name_ = "Kitty")
        : name(name_)
        {
                std::cout << "Cat " << name << " created." << std::endl;
        }
        ~Cat(){
                std::cout << "Cat " << name << " destroyed." << std::endl;
        }
        void eatFood(){
                std::cout << "Food eaten by cat named " << name << "." << std::endl;
        }
private:
        std::string name;
};

Cat* makeCat1() {
        return new Cat("Cat1");
}

Cat makeCat2() {
        return Cat("Cat2");
}

int main (){
        Cat kit = makeCat2();
        kit.eatFood();

        Cat *molly = makeCat1();
        molly->eatFood();
        delete molly;

        return 0;
}

Он выдаст результат:

Cat Cat2 created.
Food eaten by cat named Cat2.
Cat Cat1 created.
Food eaten by cat named Cat1.
Cat Cat1 destroyed.
Cat Cat2 destroyed.

Я предлагаю вам изучить основную книгу об обложке С++ для покрытия, прежде чем продолжить.

Ответ 2

new Cat("fluffy") создает указатель. Вам нужно указать Cat* как возвращаемый тип. Поскольку объект создается в куче, он будет доступен после возврата функции.

Ответ 3

Ошибка в отношении недопустимого использования памяти, кроме утечки памяти в конце вашей программы. Если что-то создано в куче (например, с new), тогда вам нужно вызвать delete, чтобы освободить его.

У вас также много синтаксических ошибок, исправленных ниже.

Cat* makeCat() 
{
  Cat *lady = new Cat("fluffy");
  return lady;
}

int main (int argc, char** argv) 
{

  Cat* molly = makeCat();
  molly->eatFood(); 

  delete molly;//This was added
  return 0;
}

Ответ 4

Так как lady создается в куче (с new), он не будет уничтожен при выходе из метода makeCat. Таким образом, вызов на molly вполне допустим.

НО, у вас есть утечка памяти. Вам нужно удалить molly после его использования (когда-нибудь в будущем). Поскольку ваша программа заканчивается, это не имеет большого значения. В более крупной программе это будет очень большой проблемой.

Ответ 5

Проблема не в "Использовании после бесплатного"; более вероятно, что вы не удаляете новый экземпляр.

Ответ 6

Я думаю, что это должно быть Cat *lady и Cat *molly, но это должно быть нормально.

Ответ 7

Если ваш complier поддерживает С++ 11, вы можете использовать unique_ptr здесь:

#include <iostream>
#include <memory>

using namespace std;
class Cat {
    public:
        Cat() {
            cout << "Cat created" << endl;
        }
        ~Cat() {
            cout << "Cat destroyed" << endl;
        }
        void eatFood() {
            cout << "Cat is eating food" << endl;
        }
};

unique_ptr<Cat> makeCat() {
    unique_ptr<Cat> lady( new Cat );
    return lady;
}

int main () {
    unique_ptr<Cat> molly = makeCat();
    molly->eatFood();
    return 0;
}

Теперь вам не нужно беспокоиться об удалении созданного объекта. Он будет удален, как только мотив-указатель выходит за рамки:

Cat created
Cat is eating food
Cat destroyed