void foo(int i)
{
char* p = new char[10];
if (i)
{
p = 0;
}
delete[] p;
}在上面的代码片段中,p资源被引用为零。这会在我的代码中产生内存泄漏吗?
发布于 2021-03-05 14:03:30
是的,它会泄漏,以防i != 0。您的变量p指向内存中的某个地址,并通过执行p = 0;擦除该指针。因此,指令delete[] p;将为nullptr指针工作,并且您不会释放已分配的内存。
对于这种类型的问题,我们使用智能指针(unique_ptr、shared_ptr等)以及STL容器和对象,如std::string、std::vector<char>、std::list<char>等。
因此,在您的情况下,您必须将代码更改为类似于
{
char* p = new char[10];
if (i)
{
if (p) {
delete[] p;
p = 0;
}
}
if (p) {
delete[] p;
p = 0;
}
}发布于 2021-03-05 14:04:42
在函数foo中,如果i不为零,则将指针p的值设置为0,该指针实际上是指向动态数组开头的指针:
if(i)
{
p = 0;
}因此,当i为非零值时,p不再指向数组的开头,并且delete命令将无法释放您在函数中创建的数组。
所以,是的,当i为非零时,你的函数将会泄漏内存。如果我是你我不会改变p。在结束之前保持不变,这样您就可以对它调用delete []并释放数组。
或者,考虑使用std::vector:
std::vector<char> vec(10);这做了一些等效的事情,除了它将自动为您处理内存分配/释放。
https://stackoverflow.com/questions/66487154
复制相似问题