如何使用指针从函数传递堆上的对象地址

时间:2015-08-30 19:03:05

标签: 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);
  //cout << f2->getHeight() << endl;
  return 0;
}

当我运行它时,我得到一个总线错误:10。哦,我确实喜欢猫。

4 个答案:

答案 0 :(得分:5)

更改函数的签名以返回指针,并按值返回指针

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

按照目前的说法,您按值返回Feline,然后立即泄漏您使用Feline分配的new

答案 1 :(得分:4)

您的代码存在多个问题。

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

其次,您正在填写f2当前指向的内存内容。但f2未初始化,因此它指向随机存储器地址。将临时Feline复制到此内存地址会导致应用程序崩溃。

要解决这个问题,你需要更改newFeline,以便它返回分配的猫科动物的地址,而不是它的副本,如下所示:

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

其次,让f2指向newFeline的返回值,而不是改变f2的内容,如下所示:

Feline *f2;
f2 = newFeline(10, 100);

最好是将它写在一行上,如下所示:

Feline *f2 = newFeline(10, 100);

或使用C ++ 11 auto关键字:

auto f2 = newFeline(10,100);

为了防止内存泄漏,让newFeline将unique_ptr返回给Feline会更好,如下所示:

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

这样,f2(如果使用auto)也将成为unique_ptr,当f2超出范围时,分配的猫科动物将被自动删除。

答案 2 :(得分:1)

尝试使用它,即从函数返回一个指针:

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

答案 3 :(得分:1)

您的代码非常脆弱。要编译它,您可以尝试以下方法:

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

int main()
{
    Feline f2;
    f2 = newFeline(10, 100);
}

然而,这会泄漏内存并假定可以复制Feline个对象。

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

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();
}