从函数返回指向对象的指针,而不使用new来分配指针

时间:2013-09-10 04:15:04

标签: c++ new-operator

来自

中的主题

When should I use the new keyword in C++?

如果您需要从函数返回指向对象的指针,答案将讨论何时必须使用“new”以创建指向对象的指针。

但是,我的代码可以正常工作。我使用本地指针而不是为新指针分配一些内存。

node* queue::dequeue(){
  if(head==0){
    cout<<"error: the queue is empty, can't dequeue.\n";
    return 0;
  }
  else if(head->next !=0){
    node *tmp=head;
    head=head->next;
    tmp->next=0;
    return tmp;
  }
  else if(head->next ==0){
    node *tmp=head;
    head=0;
    tmp->next=0;
    return tmp;
  }
}

这是一个简单的dequeue()操作。我的tmp是一个本地指针。但我还是回来了。

归功于Mahesh

我在main()

中有以下语句
node a8(8); //node constructor with the value

因此tmp指向head指向的内容,并指向不同的节点,如a8。

由于a8在main()中有效,因此tmp在main()中也是有效的

2 个答案:

答案 0 :(得分:6)

程序运行正常,因为tmp生命周期指向的内存位置超出了dequeue成员函数的范围。 tmp位于堆栈上,它的生命时间在函数返回时结束,但它指向的内存位置却不是这样。

相比之下,这段代码并不安全:

int* boom()
{
    int sVar = 10;
    int *ptr = &sVar;

    return ptr;
} // life time of sVar ends here

指向的内存位置ptr在函数返回之前有效(但不会在返回之后)。

答案 1 :(得分:1)

该函数返回一个本地指针,该指针是全局(或类成员)指针head的副本。它没有返回指向局部变量的指针。没关系。