[英]Freeing memory that was allocated in a function that returns a pointer to that memory (C++)
[英]C++ (compiler?) freeing memory allocated in function
我目前正在用C +做一些大学工作(真的是C,只是交换malloc并免费使用new和delete)。 问题在于,即使指针指向该内存空间,编译器也会取消分配在函数中分配的内存,从而在尝试访问所述结构字段时导致分段错误。 (简化示例)下面的代码:
PS:我正在使用-Og编译为C ++ 2003标准。
main.cpp:
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
struct Usu{
long unsigned int DNI;
char Correo[30];
char Nombre[30];
char Foto[20][20];
char *publicaciones;
long unsigned int *amigos;
struct Usu *next;
};
typedef struct Usu Usuario;
void RegistrarU(Usuario *);
void InsertarUsuario(Usuario *, char *, char *, long unsigned int, Usuario *);
int main (int argc, char *argv[]) {
Usuario * baseDatos = NULL;
RegistrarU(baseDatos);
}
void RegistrarU(Usuario * baseDatos)
{
long unsigned int AuxDNI = 34212345;
char AuxNombre[30] = "Hello";
char AuxCorreo[30]= "World";
Usuario *aux = NULL;
InsertarUsuario(baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);
cout<<baseDatos->DNI; //Doesn't work here
system("pause");
}
void InsertarUsuario(Usuario * baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux)
{
baseDatos = new Usuario;
baseDatos->DNI = AuxDNI;
strcpy(baseDatos->Nombre,AuxNombre);
strcpy(baseDatos->Correo,AuxCorreo);
baseDatos->next = NULL;
cout<<baseDatos->DNI; //Works Here
system("pause");
return;
}
它不起作用,因为您正在按值传递指针。 这意味着在InsertarUsuario
内部, 您只是将局部变量baseDatos
设置为 new
分配的内存,而没有有效地给调用者任何有用的东西。
您想在被调用的函数中分配内存,并能够从调用方引用分配的对象。 为此,您需要通过addres本身传递指针。 因此,您将指针传递给指向Usuario
的指针。 就像是:
Usuario * baseDatos = NULL;
RegistrarU(&baseDatos);
void RegistrarU(Usuario ** baseDatos) {
..
InsertarUsuario(baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);
}
void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux) {
Usuario *tmpUsuario = new Usuario;
*baseDatos = tmpUsuario;
..
}
编译器不会释放内存:您根本不会更改baseDatos
的值。 InsertarUsuario
接收指针值的副本 (最初为NULL
),并在本地对其进行更改,但对参数的上拉值的更改不会反映在调用函数中。 这意味着,一旦InsertarUsuario
返回, baseDatos
将再次为NULL。
您要么需要从InsertarUsuario
返回baseDatos
(并停止接受它作为参数),要么接受指向Usuario
指针的指针( double指针 )或对该指针的引用。
您正在按值而不是引用(或指向指针的指针)将baseDatos传递到InsertarUsuario中,因此RegistrarUsuario函数中其值不变。
尝试将InsertarUsuario的原型更改为
void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux)
并称其为
InsertarUsuario(&baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.