Perché potrei ottenere una violazione dell'accesso alle eccezioni non gestite scrivendo in C ++/CLI?

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

Domanda

Ho lottato per scrivere una soluzione che esce da un C ++ Win32Console e una DLL C ++. Alla fine sono riuscito a farli parlare senza errori di linker (quindi suppongo che entrambi siano progetti C ++/CLI completamente gestiti) ma quando eseguo la console ottengo il seguente errore.

Eccezione non gestita a 0x03f71849 in azienda.pins.bank.win32console.exe: 0xc0000005: Access violation Scrittura Posizione 0x00000001.

La console mostra anche quanto segue

Eccezione non gestita: System.NullReferenceException: Riferimento oggetto non impostato su un'istanza di un oggetto. a wmain in c: ... win32console.cpp: riga 20 su _wmaincrtstartup ()

Ma suppongo che ciò sia dovuto all'eccezione non gestita.

Tracciare questo errore come posso verificarsi l'errore quando si esegue il reso nel blocco di codice seguente. (Il metodo collegato dal ritorno sembra passare bene, proprio quando il ritorno sembra andare male.) Nel caso in cui non l'avessi notato, non ho scritto il codice qui sotto, è stato generato da 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;

Modifica: e il codice Win32Console.cpp è di seguito.

//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);
}
È stato utile?

Soluzione

Dichiari un puntatore e non lo iniziali, quindi non punta su un oggetto (contiene un indirizzo di immondizia):

double* P1;     

Quindi provi a scrivere ovunque questo puntatore non iniziale punta:

P1[0] = 13;

Non è possibile utilizzare una variabile non iniziativa. Devi inizializzare P1 indicare un oggetto prima di dereferencelo.

Altri suggerimenti

double* P1;

è non inizializzato. Si tenta quindi di impostare la sua prima voce su 13. BOOM, Accesso alla violazione o peggio.

Ognuno di questi frammenti dovrebbe funzionare:

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;

Le seguenti affermazioni sono anche sbagliate quando si utilizza Unicode Build:

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

Perché stai lanciando un array normale (char) su un puntatore WCHAR_T.

Se costruisci con Unicode, dovresti cambiarli in:

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

È un comportamento indefinito convertire una stringa letterale in a TCHAR*, come se Unicode fosse definito allora TCHAR* diventerà wchar_t*, e una corda letterale non è un wchar_t* E questa conversione del puntatore è indefinita.

Sono riuscito a trovare l'errore nel modo seguente:

  • Non è stato nella linea che è apparso l'errore.
  • In realtà era nell'ultima posizione che ho PIN_PTR la memoria.

Ho usato quanto segue per copiare un vettore:

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

Il problema era PINED_PRT SIZE < unmanagedVectorSize ! Stupido errore.

Ciò ha incasinato tutta la memoria gestita, un paio di linee e funzioni esplose in seguito.

Come puoi trovare nel tuo codice: vai a disabilitare le gamme del codice, fino a quando il codice non si blocca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top