С++ - функция, возвращающая объект
// 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()
?
Ответы
Ответ 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