(C++) 如何在函数之间传递指向分配有 'new' 的对象的指针而不导致内存泄漏?
(C++) How to pass around a pointer to an object allocated with 'new' from function to function without causing a mem leak?
我正在从事一个旨在理解 内存管理 使用 C++ 的项目,
在函数内部,如果我创建一个新的 Student 对象数组,执行函数操作,然后 return 一个指向该数组的指针,如下所示:
int main(){
Student *ptr = new newStudents[50];
Student p.FunctionCall(ptr);
//stuff
delete[] ptr;
return 0;
}
然后我将在 main 中实例化对象(制作副本),也许还有其他 class 方法,注意在每次使用后调用 delete[]
。
只要我记得从最后一个存在的地方调用 delete,将堆指针从函数传回 main 和/或其他函数是否会导致内存泄漏?
约束:没有智能指针,没有命名空间,也没有 C++ 11 或更高版本。
这是为了作业。感谢所有帮助。
是的。
char* allocate_buffer() {
return new char[10];
}
int main() {
auto buf = allocate_buffer();
delete [] buf;
}
没有内存泄漏。您应该使用 std::array
或 std::vector
而不是手动管理内存。
正确的语法是:
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
和 return 获得的指针,因为它不是指向指针或指向实例的指针。它实际上是一个指向数组内存的指针,通过取消引用它,您将return获取一个实例并丢失其余部分..导致泄漏。
按照您的方法,您现在可以执行以下操作:
int main()
{
MyClass* array = function("some_file.txt");
// do something with the array above..
delete[] array; //clean up..
}
我正在从事一个旨在理解 内存管理 使用 C++ 的项目,
在函数内部,如果我创建一个新的 Student 对象数组,执行函数操作,然后 return 一个指向该数组的指针,如下所示:
int main(){
Student *ptr = new newStudents[50];
Student p.FunctionCall(ptr);
//stuff
delete[] ptr;
return 0;
}
然后我将在 main 中实例化对象(制作副本),也许还有其他 class 方法,注意在每次使用后调用 delete[]
。
只要我记得从最后一个存在的地方调用 delete,将堆指针从函数传回 main 和/或其他函数是否会导致内存泄漏?
约束:没有智能指针,没有命名空间,也没有 C++ 11 或更高版本。
这是为了作业。感谢所有帮助。
是的。
char* allocate_buffer() {
return new char[10];
}
int main() {
auto buf = allocate_buffer();
delete [] buf;
}
没有内存泄漏。您应该使用 std::array
或 std::vector
而不是手动管理内存。
正确的语法是:
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
和 return 获得的指针,因为它不是指向指针或指向实例的指针。它实际上是一个指向数组内存的指针,通过取消引用它,您将return获取一个实例并丢失其余部分..导致泄漏。
按照您的方法,您现在可以执行以下操作:
int main()
{
MyClass* array = function("some_file.txt");
// do something with the array above..
delete[] array; //clean up..
}