¿Por qué podría obtener una escritura de violación de acceso de excepción sin control en C ++/CLI?

StackOverflow https://stackoverflow.com/questions/5886103

Pregunta

He estado luchando escribiendo una solución que existe de un cónsole C ++ Win32 y una DLL C ++. Finalmente logré que hablaran sin errores de enlace (así que supongo que ambos son proyectos C ++/CLI totalmente administrados) pero cuando ejecuto la consola recibo el siguiente error.

Excepción no controlada en 0x03f71849 en Company.pins.bank.win32Console.exe: 0xc0000005: Ubicación de escritura de violación de acceso 0x00000001.

La consola también muestra lo siguiente

Excepción no controlada: System.NullReferenceException: Referencia de objeto no establecido en una instancia de un objeto. en WMain en c: ... win32console.cpp: línea 20 en _wmaincrtstartup ()

Pero supongo que esto se debe a la excepción no controlada.

Rastrear este error, así como puedo, el error ocurre al hacer la retorno en el siguiente bloque de código. (El método vinculado por la devolución parece pasar bien, solo que cuando regresa parece ir mal). En caso de que no lo hayas notado, no escribí el siguiente código yo mismo, fue generado por Visual Studio.

#ifdef WPRFLAG
int wmainCRTStartup(
#else  /* WPRFLAG */
int mainCRTStartup(
#endif  /* WPRFLAG */

#endif  /* _WINMAIN_ */
        void
        )
{
        /*
         * The /GS security cookie must be initialized before any exception
         * handling targetting the current image is registered.  No function
         * using exception handling can be called in the current image until
         * after __security_init_cookie has been called.
         */
        __security_init_cookie();

        return __tmainCRTStartup();
}

#include "stdafx.h"
#include "UInstruction.h"

#define DllExport  __declspec(dllexport)
#define DllImport  __declspec(dllimport)

using namespace System;

Editar: y el código Win32Console.cpp está a continuación.

//int main(array<System::String ^> ^args)
int _tmain(int argc, _TCHAR* argv[])
{
    auto P2 = (TCHAR *)"3 Barrowstead";
    TCHAR* P3 = (TCHAR *)"3 Barrowstead";
    double* P1;
    P1[0] = 13;

    UserInstruction(P1, P2, P3);
}
¿Fue útil?

Solución

Declara un puntero y no lo inicializa para que no apunte a un objeto (contiene alguna dirección de basura):

double* P1;     

Luego intenta escribir donde sea que este puntero no inicializado apunte:

P1[0] = 13;

No puede usar una variable no inicializada. Necesitas inicializar P1 para apuntar a algún objeto antes de que lo desertiga.

Otros consejos

double* P1;

no está inicializado. Luego intenta establecer su primera entrada a 13. Boom, violación de acceso o peor.

Cualquiera de estos fragmentos debería funcionar:

double P1;
P1 = 13;
UserInstruction(&P1, P2, P3);

o

double P1[1];
P1[0] = 13;
UserInstruction(P1, P2, P3);

o

double *P1 = new double[1];
P1[0] = 13;
UserInstruction(P1, P2, P3);
delete[] P1;

Las siguientes afirmaciones también son incorrectas cuando se usa UNICODE BUILD:

  auto P2 = (TCHAR *)"3 Barrowstead";
  TCHAR* P3 = (TCHAR *)"3 Barrowstead"; 

Porque estás lanzando una matriz normal (char) a un puntero wchar_t.

Si construye con Unicode, debe cambiarlos en:

  LPCTSTR P2 = _T("3 Barrowstead");
  LPCTSTR P3 = _T("Barrowstead"); 

Es un comportamiento indefinido convertir una cadena literal a un TCHAR*, como si unicode se define entonces TCHAR* se convertirá wchar_t*, y una cadena literal no es un wchar_t* Y esta conversión de puntero no está definida.

Me las arreglé para encontrar el error de la siguiente manera:

  • No fue en la línea que surgió el error.
  • En realidad fue en la última ubicación que tengo PIN_PTR la memoria.

He usado lo siguiente para copiar un vector:

memcpy(&pined_ptr[0],&unmanagedvector[0],sizeofunmanagedvector);

El problema era PINED_PRT SIZE < unmanagedVectorSize ! Error estúpido.

Esto arruinó toda la memoria administrada, un par de líneas y funciones expuestas más tarde.

Cómo puede encontrar en su código: Vaya a deshabilitar los rangos del código, hasta que su código no se bloquee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top