在C和c++中释放内存时,我只需要内存地址还是需要任何特定的变量?
所以如果我要做这样的事情:
int* test()
{
int* x = new int(5);
return x;
}
int main(int argc, char** argv)
{
int* y = test();
delete y;
return 0;
}
这会导致内存泄漏吗?谢谢!
不,那里不会有任何泄漏,但话又说回来,
里面也不会有。int test()
{
return 5;
}
int main(int argc, char** argv)
{
int y = test();
return 0;
}
您的代码,就像它一样,不会泄漏(正如其他人已经说过的)。然而,它对的要求非常小,就会中断并可能泄漏:
int* test()
{
int* x = new int(5);
return x;
}
int main(int argc, char** argv)
{
int* y = test();
int* z = test();
delete y;
delete z;
return 0;
}
这段代码现在可能泄露,因为new
可能抛出,如果对new
(z=...
)的第二次调用抛出,那么第一个指针(y
)永远不能被删除。任何其他可以抛出的函数(不仅仅是对new
的第二次调用)都会引起同样的问题。
这就是为什么智能指针是必须的:它们使用RAII并允许您编写异常安全的代码,这是体面的c++的基础。这段代码根本不能泄漏:
std::unique_ptr<int> test()
{
std::unique_ptr<int> x(new int(5));
return x;
}
int main(int argc, char** argv)
{
std::unique_ptr<int> y = test();
std::unique_ptr<int> z = test();
return 0;
}
pointer
,正如其名称所示,只是一个指向堆上对象的地址。所以你做得很好。
您只需要内存地址来释放已分配的空间。但是要确保相应地释放它(在c++中),即,如果它是一个数组,则调用delete y[]
,就像这样…
在C语言中,您只需要基址,当您调用free()
时,将释放分配的全部空间。你的代码中不会有任何内存泄漏