C++:这个代码有什么问题吗?它编译得很好,但人们告诉我会有内存泄漏

C++ :: Is there anything wrong with this code? It compiles fine but people tell me there will be a memory leak

本文关键字:很好 内存 告诉我 泄漏 代码 什么 问题 C++ 编译      更新时间:2023-10-16

假设存在一个用户定义的类Student。考虑以下两个功能:

Student someFunc1() {
    return *(new Student("John",25)); 
}
Student& someFunc2() {
    return *(new Student("John",25)); 
}

如果不详细说明它们为什么以现在的方式实施,它们都是正确的吗?有人告诉我会有内存泄漏,但怎么会呢?

是的,肯定有问题。

someFunc1()肯定会导致内存泄漏,因为分配对象的内存地址丢失了。

someFunc2()将导致内存泄漏的风险,因为函数的用户必须记住删除具有奇怪语法的返回对象(delete &object)。

它们都不是好的C++。正确的版本是:

Student someFunc3() {
    return Student("John",25); 
}

第一个函数分配一个对象,该对象取消引用并返回。默认情况下,return执行对象的复制。因此,最初分配的对象仍然存在,但不再可访问。根据定义,这是内存泄漏。

然而,在第二种情况下,返回对所分配对象的引用,而不是副本。这样,调用者仍然可以获取对象的地址并将其删除。

当您在c++中声明new变量时,它们是在堆上分配的。当变量超出范围时(如程序结束时),内存将保持分配状态,除非您在代码中明确delete它们。

您应该阅读此

相关文章: