// 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()
上会有“免费使用后”错误吗?
答案 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 *lady
和Cat *molly
,否则它应该没问题。