如何在函数中返回指针之前删除指针?
How to delete a pointer before return it in a function?
如果我们有这样的函数:
int* foo()
{
int *x;
x = new int;
delete x;
return x;
}
我们需要在函数中返回一个指针,但我们学到的是我们需要在 finals 中删除一个空格。
如果我们像上面一样先删除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 不再存在。
这里有两件事,首先不,在delete x;
之后返回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
不会删除指针。它的作用是说"我(程序)已经完成了这个指针指向的任何内容。您(操作系统内核)现在可以将其用于任何事情。我不会再用这个地址做任何事情了。我保证。不必为每个指针删除一个。这是完全可以的,并且不会导致内存泄漏:
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;
}
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存