Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在函数中返回指针之前删除它?_C++ - Fatal编程技术网

C++ 如何在函数中返回指针之前删除它?

C++ 如何在函数中返回指针之前删除它?,c++,C++,如果我们有这样一个函数: int* foo() { int *x; x = new int; delete x; return x; } 我们需要在一个函数中返回一个指针,但我们学到的是我们需要在最后一个函数中删除一个空格 如果我们像上面那样先删除x,那么在最后一行返回x是否有意义?因为x已经不存在了 但是如果我们在返回之前不删除x,函数将完成 我们怎么办? 或者我们真的不需要删除在内存中分配的空间?完全没有理由在返回指针之前删除它。您将得到的唯一信息是已分配但不再分配的内存

如果我们有这样一个函数:

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

  delete x;
  return x;
}
我们需要在一个函数中返回一个指针,但我们学到的是我们需要在最后一个函数中删除一个空格

如果我们像上面那样先删除
x
,那么在最后一行返回
x
是否有意义?因为
x
已经不存在了

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

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

完全没有理由在返回指针之前删除它。您将得到的唯一信息是已分配但不再分配的内存块的内存地址

这在本规范中是有意义的:

main()
{
   int *ptr = foo()
   cout << "The memory address that function foo got "
        << "allocated to a local pointer is " << ptr << endl;
}
您需要了解的是,
delete
不会删除指针。它所做的是对操作系统说:“我(程序)已经完成了这个指针指向的任何东西。你(操作系统内核)现在可以使用它做任何事情。我保证,我不会再使用这个地址做任何事情。”。您不必对每个指针进行一次删除。这完全正常,不会导致内存泄漏:

  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];
int*p=新的int;
int*a[3]={p,p,p};
int n;
cout n;
删除[n];
这是相当愚蠢的代码,但它表明了我的观点。这与指针无关。这是指针指向的东西


记住一件事。删除指针时,指针不会获取空值。你必须单独处理

您确实需要在某个阶段
删除
指针,但这不必与
新建
指针的功能范围相同。这可能发生在你的职能范围之外,我认为这正是你想要实现的

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

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

在函数的作用域(在{}之间)中声明的变量在离开函数时被分发,因为它们构建在函数的堆栈内存上

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

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

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

如果函数的目的是提供某个类型的有效指针, 一旦不再需要使用该变量,删除操作将必须在函数之外进行

最后两个提示:

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

如果我们像上面那样先删除x,那么在中返回x是否有意义 最后一行?因为x已经不存在了

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

或者我们真的不需要删除在中分配的空间 记忆

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

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

您可以做的是在函数外部声明指针,然后在从函数返回指针
x
后,可以将其删除到返回指针的函数外部的任何位置

提示:
考虑使用,因为和其他好处一样,使用<代码>智能指针的最大好处之一是,它们自动释放分配的内存,并省去了明确释放内存的头痛。

删除指针后,返回它是没有意义的。返回一个被删除项目的指针是一个坏计划。取消对它的引用将导致UB。如果知道被调用方将清除内存,则在函数中新建项并返回指向它的指针。使用
std::unique\u ptr
而不是
int*
。当内存超出范围时,它将自动
删除
内存。是的,唯一指针很好,但是如何阻止正在学习指针的人编写
return std::make_unique().get()只是为了让它使用返回类型
int*
?;)编译删除后返回
nullptr
,并记录这可能发生的情况。但是程序员在使用这样的API后如何记得删除它呢?函数返回指针是很常见的,我们没有在使用返回指针的函数后删除它的习惯。一种方法是使用智能指针(unique_ptr或shared_ptr)。或者您可以使用模板所有者的方式。有关更多详细信息,您可以查看@Jarkid,程序员有责任为每一个
新的
创建一个
delete
int* foo()
{
  int *x;
  x = new int;
  return x;
}

int *px = foo();
// use px in some way
delete px;
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;
}