繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM