繁体   English   中英

如何在函数返回之前删除指针?

[英]How to delete a pointer before return it in a function?

如果我们有这样的函数:

int* foo()
{
  int *x;
  x = new int;

  delete x;
  return x;
}

我们需要在函数中返回一个指针,但我们学到的是我们需要在final中删除一个空格。

如果我们首先删除x ,那么在最后一行返回x是否有意义? 因为x不再存在。

但是如果我们在返回之前不删除x ,则该函数将完成。

我们怎么办? 或者我们真的不需要删除在内存中分配的空间?

您确实需要在某个阶段delete指针,但这不一定在您new它的同一函数范围内。 它可能发生在你的功能之外,我认为这是你想要实现的。

int* foo()
{
  int *x;
  x = new int;
  return x;
}

int *px = foo();
// use px in some way
delete px;

如果我们先如上所述删除x,那么在最后一行返回x是否有意义? 因为x不再存在了。

这里有两件事,首先没有delete x;后返回x没有意义delete x; 第二,删除x不会删除x本身,它只会释放x指向的内存。

或者我们真的不需要删除在内存中分配的空间?

错误。 您需要释放每个动态分配的内存位置。

但如果我们在返回之前不删除x,则该函数将完成。 我们该怎么办?

你可以做的是在函数外部声明指针,然后在从函数返回指针x之后,你可以在返回指针的函数之外的任何地方删除它。

提示:考虑使用智能指针,因为除了其他好处之外,使用Smart Pointers的最大好处之一是它们可以自动释放分配的内存,并且可以省去显式释放内存的麻烦。

在返回之前完全没有理由删除指针。 你唯一能得到的就是分配但不再存在的内存的内存地址。

这段代码有意义:

main()
{
   int *ptr = foo()
   cout << "The memory address that function foo got "
        << "allocated to a local pointer is " << ptr << endl;
}

但是,来吧,谁会想写这样的东西?

但是,在函数调用之后删除是完全可以的,如下所示:

int* ptr = foo();
delete ptr;

您需要了解的是delete不会删除指针。 它的作用是说“我(程序)完成了这个指针所指向的任何东西。你(os内核)现在可以用它做什么。我不会再用那个地址做任何事了。我保证。” 到操作系统。 您不必为每个指针删除一个。 这是完全正常的,并且不会导致内存泄漏:

  int *p=new int;
  int *a[3]={p, p, p};
  int n;
  cout << "Via which pointer in array a do you "
       << "want to delete the allocated memory? ";
  cin >> n;
  delete a[n];

这是非常愚蠢的代码,但它显示了我的观点。 它不是关于指针。 这是关于指针指向的内容。

记住一件事。 删除指针时,指针不会获得NULL值。 你必须分开处理。

在函数范围内(函数之间)声明的变量在离开函数时被破坏,因为它们构建在函数的堆栈内存中。

使用new()时,内存在堆上分配,另一个内存空间与函数无关。

在删除指向此内存的指针之前,不会释放此内存,这就是为什么一旦使用new(),您必须在应用程序返回之前删除指针。

除非您希望应用程序崩溃,否则返回已删除的指针没有意义。 取消引用(访问)已删除的指针可能会导致应用程序崩溃或内存损坏。

如果函数的目的是在某种类型上提供有效的指针,那么一旦你不再需要使用变量,删除就必须在函数之外进行。

最后两个提示:

  • 不要删除指针两次,这会导致崩溃。
  • 将0分配给已删除(或未分配)的指针可以是一个保护:

例如:

int * pt = 0;

pt = new int;
*pt = 12;

delete pt;
pt=0;

if (pt==0) {
   // the pointer doesn't point to anything, and we can test it safely
}

/* ... */

if (pt!=0) {
    delete pt; //this second delete wont occur if pt is null (==0)
    pt=0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM