c++ - (C ++)如何在函数之间传递指向分配有'new'的对象的指针而不会导致内存泄漏?
问题描述
我正在研究一个旨在了解使用 C++进行内存管理的项目,
在函数内部,如果我创建一个新的 Student 对象数组,执行函数操作,然后返回指向该数组的指针,如下所示:
int main(){
Student *ptr = new newStudents[50];
Student p.FunctionCall(ptr);
//stuff
delete[] ptr;
return 0;
}
然后,我将在 main 和其他类方法中实例化对象(制作副本),并注意delete[]
在每次使用后调用。
只要我记得从它存在的最后一个位置调用删除,它是否会导致内存泄漏将堆指针从函数传递回主函数或其他函数?
约束:没有智能指针,没有命名空间,也没有 C++ 11 或更高版本。
是为了一个任务。所有帮助表示赞赏。
解决方案
正确的语法是:
MyClass* function(const char* file) {
MyClass *x = new MyClass[50]; //class_type* array_name = new class_type[amount];
//stuff to parse values and then instantiate my classes
return x; // return x directly as a pointer..
}
首先..不要取消引用您从中获得的指针new
并返回它,因为它不是指向指针的指针或指向实例的指针。它实际上是一个指向数组内存的指针,通过取消引用它,您将返回一个实例并丢失其余的......导致泄漏。
因此,按照您的方式,您现在可以执行以下操作:
int main()
{
MyClass* array = function("some_file.txt");
// do something with the array above..
delete[] array; //clean up..
}
推荐阅读
- android - 如何在android编辑文本中收听输入键?
- excel - vb.net 自动化使用来自 OLAP 多维数据集的数据刷新 Excel 文件
- javascript - React Bootstrap Container,子级渲染 2px 高
- sh - POSIX sh 检查(测试)内置 set 选项的值
- python - 同时运行多个 jpynb 文件
- javascript - 如何使用图像触发覆盖
- c# - 如何加载包含来自 HTTP 内容的数据的列表?
- c++ - 从属模板名称和 C++20 ADL
- amazon-web-services - 如何通过 ID 检查 API Gateway 部署内容
- dependency-injection - JSR 352 - Java 批处理 - 无法在侦听器工件中注入服务 bean 或 DAO