在 C 和 C++ 中释放内存时,我只需要内存地址还是需要任何特定变量?
因此,如果我要执行以下操作:
int* test()
{
int* x = new int(5);
return x;
}
int main(int argc, char** argv)
{
int* y = test();
delete y;
return 0;
}
这会导致内存泄漏吗?谢谢!
在 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;
}
Apointer
就像 ist name 所述,只是一个指向堆上对象的地址。所以你所做的工作非常好。
请参阅此处以获取不同的线程。
您只需要内存地址来释放分配的空间。但是请确保您相应地释放它(在 C++ 中),即,delete y[]
如果它是一个数组,则调用它,就像那样......
在 C 中,您只需要基地址,当您调用 时free()
,将释放完整的分配空间。您的代码中不会有任何内存泄漏。