如果我们有这样的功能:
int* foo()
{
int *x;
x = new int;
delete x;
return x;
}
我们需要在函数中返回一个指针,但我们学到的是我们需要在final中删除一个空格。
如果我们首先删除x
,那么在最后一行返回x
是否有意义?因为x
不再存在。
但如果我们在返回之前不删除x
,则该函数将完成。
我们该怎么办? 或者我们真的不需要删除在内存中分配的空间?
答案 0 :(得分:7)
在某个阶段你需要delete
指针,但这不一定与你new
的函数范围相同。它可能发生在你的功能之外,我认为这是你想要实现的。
int* foo()
{
int *x;
x = new int;
return x;
}
int *px = foo();
// use px in some way
delete px;
答案 1 :(得分:2)
如果我们首先删除x,那么返回x是否有意义 最后一行?因为x不再存在了。
这里有两件事,首先是在x
之后返回delete x;
没有意义,其次,删除x
不会删除x
本身,它只会释放x
指向的内存。
或者我们并不真正需要删除分配的空间 存储器?
错误。您需要释放每个动态分配的内存位置。
但如果我们在返回之前不删除x,则该功能将完成。 我们怎么办?
你可以做的是在函数外面声明指针,然后在从函数返回指针x
之后,你可以在返回指针的函数之外的任何地方删除它。
提示强>
考虑使用Smart Pointers,因为除了其他好处之外,使用Smart Pointers
的最大好处之一是它们可以自动释放分配的内存,并且可以省去释放内存的麻烦。
答案 2 :(得分:1)
在返回之前完全没有理由删除指针。你唯一能得到的就是分配但不再存在的内存的内存地址。
这段代码有意义:
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
不会删除指针。它的作用是说&#34;我(程序)完成了这个指针指向的任何东西。你(os内核)现在可以用它做任何事情。我不会再用那个地址做任何事了。我保证。&#34;到操作系统。您不必为每个指针删除一个。这是完全正常的,并且不会导致内存泄漏:
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值。你必须分开处理。
答案 3 :(得分:0)
在函数的范围内(函数之间)声明的变量在离开函数时被破坏,因为它们构建在函数的堆栈内存中。
使用new()时,内存在堆上分配,另一个内存空间与函数无关。
在删除指向此内存的指针之前,不会释放此内存,这就是为什么一旦使用new(),您必须在应用程序返回之前删除指针。
除非您希望应用程序崩溃,否则返回已删除的指针没有意义。解除引用(访问)已删除的指针可能会导致应用程序崩溃或内存损坏。
如果你的函数的目的是在某种类型上提供有效的指针, 一旦你不再需要使用变量,删除就必须在函数之外发生。
最后两个提示:
例如:
procedure TMyThread.Execute;
begin
try
CoInitialize(nil);
try
while not Terminated do
begin
DoWorkThatMayUseCOM;
end;
finally
CoUninitialize();
end;
except
on E: Exception do
// log exception
Log(E);
end;
end;