3

从线程中

什么时候应该在 C++ 中使用 new 关键字?

如果您需要从函数返回指向对象的指针,则答案谈到何时必须使用“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 是一个本地指针。但我还是退货了。

归功于马赫什

我在 main() 中有以下语句

node a8(8); //node constructor with the value

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

由于 a8 在整个 main() 中有效,因此 tmp 在整个 main() 中也有效

4

2 回答 2

7

程序运行良好,因为tmp生命周期指向的内存位置超出了出队成员函数的范围。tmp位于堆栈上,随着函数返回,它的生命周期结束,但它指向的内存位置并非如此。

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

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

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

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

于 2013-09-10T04:18:54.263 回答
1

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

于 2013-09-10T04:19:39.827 回答