C++ 如何传递对象';从使用指针的函数获取堆上的地址

C++ 如何传递对象';从使用指针的函数获取堆上的地址,c++,pointers,C++,Pointers,我试图在堆上创建一个对象,然后从调用函数传回它的地址,但我无法让它工作 如果这个函数是从main调用的,为什么我不能将对象的地址存储在一个新指针中 Feline newFeline(int height, int weight) { Feline *myFeline = new Feline(height, weight); return *myFeline; } int main() { Feline *f2; *f2 = newFeline(10, 100); //co

我试图在堆上创建一个对象,然后从调用函数传回它的地址,但我无法让它工作

如果这个函数是从main调用的,为什么我不能将对象的地址存储在一个新指针中

Feline newFeline(int height, int weight) {
  Feline *myFeline = new Feline(height, weight);
  return *myFeline;
}

int main()
{
  Feline *f2;
  *f2 = newFeline(10, 100);
  //cout << f2->getHeight() << endl;
  return 0;
}
猫科新猫科动物(身高、体重){
猫科动物*猫科动物=新的猫科动物(身高、体重);
返回*猫科动物;
}
int main()
{
猫*f2;
*f2=新猫(10100);

//cout getHeight()更改函数的签名以返回指针,然后按值返回指针

Feline* newFeline(int height, int weight)
{
  Feline *myFeline = new Feline(height, weight);
  return myFeline;
}

如当前所述,您按值返回一个
,然后立即泄漏分配给
new

,尝试使用此ie,从函数返回指针:

Feline* newFeline(int height, int weight)
{
  Feline *myFeline = new Feline(height, weight);
  return myFeline;
}

您的代码非常脆弱。要将其编译,您可以尝试以下操作:

Feline newFeline(int height, int weight)
{
    Feline *myFeline = new Feline(height, weight);
    return *myFeline;
}

int main()
{
    Feline f2;
    f2 = newFeline(10, 100);
}
但是,这会泄漏内存,并假设猫科动物可以复制对象

在这种情况下,我只需直接调用猫的构造函数,而不使用任何指针或单独的函数

int main()
{
    Feline f2(10, 100);
}
如果您确实想从函数返回它,如果
Feline
支持复制并且您没有多态性地使用类型,则可以使用以下选项:

Feline newFeline(int height, int weight)
{
    Feline myFeline(height, weight);
    return myFeline;
}

int main()
{
    Feline f2 = newFeline(10, 100);
}
但是,如果您将此函数的结果复制到
Feline
的基类中,您将获得对象切片

如果这是一个问题,那么我建议您使用智能指针

std::unique_ptr<Feline> newFeline(int height, int weight)
{
    std::unique_ptr<Feline> myFeline(new Feline(height, weight));
    return myFeline;
}

int main()
{
    std::unique_ptr<Feline> f2 = newFeline(10, 100);
    f2->do_stuff();
}
std::独特的猫科动物(身高、体重)
{
性病:独特的猫科动物(新猫科动物(身高、体重));
返回猫科动物;
}
int main()
{
std::unique_ptr f2=新猫(10100);
f2->do_stuff();
}

您的代码存在多个问题

首先,newFeline函数将返回一个临时Feline。并且该方法本身存在内存泄漏(分配的Feline未被释放)。通常,临时将在调用newFeline函数的语句之后消失

int main()
{
    Feline f2(10, 100);
}
其次,您正在填充f2当前指向的内存内容。但f2未初始化,因此它指向随机内存地址。将临时猫复制到此内存地址将导致应用程序崩溃

要解决此问题,您需要更改newFeline,使其返回分配的猫的地址,而不是其副本,如下所示:

Feline *newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
第二,让f2指向newFeline的返回值,不要改变f2的内容,如下所示:

Feline *newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
最好是写在一行上,如下所示:

Feline *newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
或者使用C++11自动关键字:

auto f2 = newFeline(10,100);
为了防止内存泄漏,最好让New猫科动物向猫科动物返回一个独特的\u ptr,如下所示:

Feline *newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
Feline *f2;
f2 = newFeline(10, 100);
Feline *f2 = newFeline(10, 100);
std::unique_ptr<Feline> newFeline(int height, int weight) {
   Feline *myFeline = new Feline(height, weight);
   return myFeline;
}
std::独特的猫科动物(身高、体重){
猫科动物*猫科动物=新的猫科动物(身高、体重);
返回猫科动物;
}

这样,f2(如果使用自动)也将成为唯一的ptr,当f2超出范围时,分配的猫将自动删除。

使用指针返回类型
Feline*newFeline(int-height,int-weight)
return myFeline;
@TimHUK:当问题在回答后被更改时,这真的很痛苦。这会让任何稍后阅读本文的人感到困惑。此外,您的更改使您的代码甚至无法编译,您仍然在您的问题中声称这一点。这条线索上有这么多很棒的答案。我们的想法不过,创建一个唯一的_ptr(当f2超出范围时也会删除它)确实很好。谢谢大家。