[英]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.