2013-05-21 81 views
1

当在C和C++中释放内存时,我只需要内存地址还是需要任何特定变量?C/C++中的内存管理范围

所以,如果我做一些事情,如:

int* test() 
{ 
    int* x = new int(5); 
    return x; 
} 

int main(int argc, char** argv) 
{ 
    int* y = test(); 

    delete y; 

    return 0; 
} 

这会导致内存泄漏?谢谢!

+0

这里没有泄漏。但是,要避免这样的代码,其中通过函数分配内存并手动解除分配。另一个开发人员在没有这方面知识的情况下使用功能测试是造成相当多内存泄漏问题的原因。 – Laz

回答

7

没有,就不会有任何有泄漏,但话又说回来,也不会有,如果来

int test() 
{ 
    return 5; 
} 

int main(int argc, char** argv) 
{ 
    int y = test(); 
    return 0; 
} 

避免动态分配。

+3

*如果可以,请避免动态分配*真实。如果你无法避免它,请使用智能指针。 – syam

+0

哦,不,不,傻。我实际上不会那么乐意投入动态分配。这只是一个例子,说明了我想要解释的问题。 :d – Lemmons

1

A pointer与名称状态一样,只是指向堆上对象的地址。所以你做的很好。

请参阅here了解不同的线程。

1

你只需要内存地址来释放分配的空间。但要确保你相应地释放它(在C++),即称之为delete y[]如果它是一个数组,这样的...

在C语言中,你只需要只有基址,当你调用free(),完整的分配空间将被释放。 代码中不会有任何内存泄漏。

2

您的代码不会泄漏(正如其他人已经说过的那样)。但是,它需要很少打破,并可能泄露:

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; 
}