C++:这个代码有什么问题吗?它编译得很好,但人们告诉我会有内存泄漏
C++ :: Is there anything wrong with this code? It compiles fine but people tell me there will be a memory leak
假设存在一个用户定义的类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
它们。
您应该阅读此
相关文章:
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 很好的语法来获取对向量/数组数据的大小引用?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 尽管一切看起来都很好,但值不会交换
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 使用移位的无符号数字作为数组的索引号是一种很好的做法
- 是否很好地使用状态模式来维护当前选定的对象?
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 静态库单独使用很好,但在引用时会抛出错误
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 有没有办法关闭文件? fclose 不能很好地工作
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- C++:这个代码有什么问题吗?它编译得很好,但人们告诉我会有内存泄漏
- 用于HBITMP的函数DestroyObject不能很好地工作(内存泄漏)
- 任何人都有一个很好的C++共享内存容器