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

C++ C++;::这个代码有什么问题吗?它编译得很好,但人们告诉我会有内存泄漏,c++,C++,假设有一个用户定义的类Student。考虑以下两个功能: Student someFunc1() { return *(new Student("John",25)); } Student& someFunc2() { return *(new Student("John",25)); } 在没有详细说明为什么它们会以这样的方式实施的情况下,它们都是正确的吗?有人告诉我,会有内存泄漏,但是为什么?< p>当你在C++中声明“代码>新< /COD>变量时,它们会在堆

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

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

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

在没有详细说明为什么它们会以这样的方式实施的情况下,它们都是正确的吗?有人告诉我,会有内存泄漏,但是为什么?

< p>当你在C++中声明“代码>新< /COD>变量时,它们会在堆上分配。当变量超出范围时(如程序结束时),内存保持分配状态,除非您在代码中明确地
删除它们


你应该读一读

是的,肯定有问题

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

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

两者都不是好的C++。正确的版本是:

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

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


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

第一个对象存在无法恢复的内存泄漏。第二个可能存在内存泄漏,但调用方仍然可以取消分配。我建议花一些时间从一些好书中学习C++。一次只学一个小问题需要300年的时间。你为什么不试试呢?闻起来像是家庭作业……请解释第二个函数中发生了什么。是否相当于返回指针?当你很容易关闭C++时,没有大的损失。正如@juanchopanza提到的那样,买一本书是最好的选择。否则,您将总是误解C++如何工作,结果会产生坏代码。@ AnonymousAndy:手动资源管理可能是复杂的,容易出错。我建议你停止使用
new
,直到你更好地了解这门语言。我们之所以有
std::string
和类似
std::vector
的容器,是有原因的,它们管理内存并隐藏这种复杂性,这样您就可以继续实际的编程逻辑。好的,那么第二个函数是否等效于返回指针?@AnonymousAndy第二个函数返回一个引用(
&
语法)到新分配的对象。它几乎等同于返回指针,只是变量不是内存地址,没有指针解引用语法的麻烦,并且
nullptr
不可能使用引用。不过,优化编译器可能会在第一种情况下应用复制省略。但不能保证它会。