C ++(编译器?)释放在函数中分配的内存

时间:2014-02-16 23:17:23

标签: c++ debugging memory

我目前正在C +做一些大学工作(实际上是C,只需交换malloc并免费获取新的和删除)。问题是编译器解除了在函数中分配的内存,即使指针指向该内存空间,在尝试访问所述结构字段时也会导致分段错误。 (简化示例)以下代码:

P.S。:我正在使用-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;
}

3 个答案:

答案 0 :(得分:3)

它不起作用,因为您按值传递指针。这意味着在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;
  ..
}

答案 1 :(得分:0)

编译器不释放内存:您根本不会更改baseDatos的值。 InsertarUsuario收到指针值的副本(最初NULL),本地更改它,但更改为参数的直接值没有反映在调用函数中。这意味着一旦InsertarUsuario返回,baseDatos再次为NULL。

您需要从baseDatos返回InsertarUsuario(并停止接受它作为参数),或接受指向Usuario指针的指针(双指针)或对该指针的引用。

答案 2 :(得分:0)

您正在通过值将baseDatos传递给InsertarUsuario,而不是引用(或指针指针),因此其在RegistrarUsuario函数中的值不会更改。

尝试将InsertarUsuario的原型更改为

void InsertarUsuario(Usuario ** baseDatos , char * AuxCorreo,char * AuxNombre,long unsigned int AuxDNI, Usuario * aux)

并将其命名为

   InsertarUsuario(&baseDatos, AuxCorreo, AuxNombre, AuxDNI, aux);