首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄露了吗?

问内存泄露了吗?
EN

Stack Overflow用户
提问于 2021-03-05 13:12:28
回答 2查看 68关注 0票数 0
代码语言:javascript
复制
void foo(int i)
{
    char* p = new char[10];
    
    if (i) 
    {
        p = 0;
    }
    
    delete[] p;
}

在上面的代码片段中,p资源被引用为零。这会在我的代码中产生内存泄漏吗?

EN

回答 2

Stack Overflow用户

发布于 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>等。

因此,在您的情况下,您必须将代码更改为类似于

代码语言:javascript
复制
{
    char* p = new char[10];
    
    if (i) 
    {
        if (p) {
            delete[] p;
            p = 0;
        }
    }
    
    if (p) {
        delete[] p;
        p = 0;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-03-05 14:04:42

在函数foo中,如果i不为零,则将指针p的值设置为0,该指针实际上是指向动态数组开头的指针:

代码语言:javascript
复制
if(i) 
{
    p = 0;
}

因此,当i为非零值时,p不再指向数组的开头,并且delete命令将无法释放您在函数中创建的数组。

所以,是的,当i为非零时,你的函数将会泄漏内存。如果我是你我不会改变p。在结束之前保持不变,这样您就可以对它调用delete []并释放数组。

或者,考虑使用std::vector:

代码语言:javascript
复制
std::vector<char> vec(10);

这做了一些等效的事情,除了它将自动为您处理内存分配/释放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66487154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档