Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Punteros en c++

Estas en el tema de Punteros en c++ en el foro de C/C++ en Foros del Web. Hola, quisiera ver si me pueden ayudar con una duda que tengo, se los agradecere mucho. Quisiera ver por que me aparece este error: Debug ...
  #1 (permalink)  
Antiguo 22/03/2010, 14:26
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Mensaje Punteros en c++

Hola, quisiera ver si me pueden ayudar con una duda que tengo, se los agradecere mucho. Quisiera ver por que me aparece este error:

Debug Assertion Failed!
Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockuse)
y me parece la opcion de Anular, Reitentar, y Anular.

Si presiono en Reintentar me aprece otro mensaje diciendo:
Se ha producido la excepcion unknown software exception (0x80000003) en la direccion 0x00404bc9.
Precione Aceptar o cancelar.
Si presiono cancelar me abre el visual para depurar el programa en:dbgdel.cpp

y me aparece el siguiente codigo(en azul esta la parte donde me marca que se detiene)
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;

RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

if (pUserData == NULL)
return;

_mlock(_HEAP_LOCK); /* block other threads */
__TRY

/* get a pointer to memory block header */
pHead = pHdr(pUserData);


/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

_free_dbg( pUserData, pHead->nBlockUse );

__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY

return;
}

#endif /* _DEBUG */


El codigo de mi programa es el siguiente:

#include<iostream.h>
#include<conio.h>
#include<time.h>

void main()
{
srand(time(NULL));
int *pNums, n,cual;
cout<<"\n¿Cuantos aleatorios vas a generar (maximo 32500)?";
cin>>n;
if(n<2) n=2;
if(n>32500) n=32500;
for(int i=0; i<n; i++)
{
if(i==0)
pNums= new int;

*(pNums+i)= rand()%100+1;


if(i<10||i==n-1)
{
cout<<"\nNumero aleatorio "<<i+1<<" "<<*pNums;//*(pNums+i);
cout<<"\nEl numero aleatorio "<<i+1
<<" esta grabado en la direccion "<<pNums;//+i;
cout<<"\aTome nota del espacio ocupado en memoria"<<endl;
getch();
}
}
cout<<"PUNTERO SU dir "<<&pNums<<" a donde apunta "<<pNums
<<" que valor tiene "<<*pNums;
cout<<"Cual numero desea ver: ";
cin>>cual;
cout<<"El numero en "<<cual<<" es: "<<*(pNums+(cual-1))<<endl;
getch();
}

Pienso yo que el error esta en la parte que esta en rojo ya que si lo quito no me marca este error. Por que me marca este error?
  #2 (permalink)  
Antiguo 22/03/2010, 14:32
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Punteros en c++

El codigo que muestras tiene "cara" de querer tener muchos enteros en memoria para trabajar con ellos, como si fuera un arreglo, pero cuando pides memoria

pNums= new int;

pides memoria para solo 1.

Recomiendo que pidas para varios

pNums= new int[n];

Hay que revisar el tamaño adecuado para el arreglo, pero intuyo que se trata de pisoteo de memoria que no pediste.
  #3 (permalink)  
Antiguo 22/03/2010, 15:24
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Mensaje Respuesta: Punteros en c++

entonces no es correcto usar una direccion en memoria sin pedirla como lo estoy haciendo?
for(int i=0; i<n; i++)
{
if(i==0)
pNums= new int; //si se le asigno por ejemplo la direccion 0x0000221

*(pNums+i)= rand()%100+1; // aui le estoy diciendo que cada vez que entre al for aumente esta direccion y guarde en esa direccion el numero aleatorio generado.
esto corriendo seria algo asi:

0x0000221 le agina un 23
0x0000222 le asigna un 5
0x0000223 le asigna un 78
0x0000224 le asigna un 1

al unica direccion que yo pedi es la que le asigna el new en:
pNums= new int;
y las demas las estoy usando tambien para guardaar numeros pero sin pedirlas ni nada es correcto hacer esto sera este el error que me marca?

seria como dice CalgaryCorpus crear un arreglo dinamico pNums= new int[n];??
  #4 (permalink)  
Antiguo 22/03/2010, 15:29
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Punteros en c++

Lo que haces es correcto desde el punto de vista que no son errores de compilacion, o de sintaxis, pero estas accediendo a memoria que nunca pediste y es alli donde el sistema operativo entra en accion y detiene a tu programa por infractor.

Etiquetas: apuntadores, assertion, c++, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:14.