C ++ - 返回对象的函数

时间:2010-09-08 14:50:38

标签: c++

// 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()上会有“免费使用后”错误吗?

7 个答案:

答案 0 :(得分:23)

更正了您的计划并创建了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.

我建议你在继续之前学习一本关于C ++封面的基础书。

答案 1 :(得分:7)

new Cat("fluffy")创建一个指针。您需要指定Cat*作为返回类型。由于对象是在堆中创建的,因此在返回函数后它仍然可用。

答案 2 :(得分:5)

除程序结束时的内存泄漏之外的内存无效使用没有错误。如果在堆上创建了某些内容(例如使用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;
}

答案 3 :(得分:3)

由于在堆上创建了lady(带有new),因此退出makeCat方法时不会销毁它。因此,molly上的通话完全有效。

但是你有内存泄漏。您需要在使用它之后删除molly(将来的某个时间。)由于您的程序结束,这不是什么大问题。在一个更大的计划中,这将是一个非常大的交易。

答案 4 :(得分:2)

问题不在于“免费使用”;更可能是你没有删除新实例。

答案 5 :(得分:1)

如果你的编译器支持c ++ 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

答案 6 :(得分:0)

我认为它应该是Cat *ladyCat *molly,否则它应该没问题。