簡體   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