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
后,可以将其删除到返回指针的函数外部的任何位置
提示:
考虑使用,因为和其他好处一样,使用<代码>智能指针的最大好处之一是,它们自动释放分配的内存,并省去了明确释放内存的头痛。删除指针后,返回它是没有意义的。返回一个被删除项目的指针是一个坏计划。取消对它的引用将导致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;
}