Почему я могу получить необработанное исключение, пишущее о нарушении прав доступа в c ++ / CLI? - PullRequest
2 голосов
/ 04 мая 2011

Я изо всех сил пытался написать решение, существующее вне c32 win32console и c ++ dll. Мне, наконец, удалось заставить их говорить без ошибок компоновщика (поэтому я предполагаю, что оба полностью управляемые проекты c ++ / CLI), но когда я запускаю консоль, я получаю следующую ошибку.

Необработанное исключение в 0x03f71849 в Company.Pins.Bank.Win32Console.exe: 0xC0000005: Запись о нарушении доступа местоположение 0x00000001.

Консоль также показывает следующее

Необработанное исключение: System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объект. в wmain в c: ... \ win32console.cpp: line 20 в _wmainCRTStartup ()

но я предполагаю, что это из-за необработанного исключения.

отслеживая эту ошибку, также как и я, ошибка возникает при выполнении возврата в приведенном ниже блоке кода. (метод, связанный с возвратом, кажется, проходит нормально, просто при возврате он кажется плохим.) На случай, если вы не заметили, я сам не писал нижеприведенный код, он был сгенерирован 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;

edit: и код win32console.cpp ниже.

//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);
}

Ответы [ 5 ]

8 голосов
/ 04 мая 2011

Вы объявляете указатель и не инициализируете его, чтобы он не указывал на объект (он содержит некоторый адрес мусора):

double* P1;     

Затем вы пытаетесь записать туда, куда указывает этот неинициализированный указатель:

P1[0] = 13;

Нельзя использовать неинициализированную переменную.Вам нужно инициализировать P1, чтобы он указывал на какой-либо объект, прежде чем разыменовывать его.

2 голосов
/ 04 мая 2011
double* P1;

неинициализирован. Затем вы пытаетесь установить для первой записи значение 13. Стрела, нарушение доступа или хуже.

Любой из этих фрагментов должен работать:

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

или

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

или

double *P1 = new double[1];
P1[0] = 13;
UserInstruction(P1, P2, P3);
delete[] P1;
1 голос
/ 04 мая 2011

Следующие операторы также неверны при использовании сборки UNICODE:

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

, потому что вы приводите обычный (char) массив к указателю wchar_t.

, если вы собираете с помощью UNICODEтогда вы должны изменить это в:

  LPCTSTR P2 = _T("3 Barrowstead");
  LPCTSTR P3 = _T("Barrowstead"); 
0 голосов
/ 28 октября 2012

Мне удалось найти ошибку следующим образом:

  • Не в строке всплывала ошибка.
  • Это было на самом деле в последнем месте, у меня есть PIN_PTR память.

Я использовал следующее для копирования вектора:

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

Проблема была PINED_PRT SIZE < unmanagedVectorSize! Глупая ошибка.

Это испортило всю управляемую память, пару строк и функции были раскрыты позже.

Как вы можете найти в своем коде: отключите диапазоны кода, пока ваш код не потерпит крах.

0 голосов
/ 04 мая 2011

Преобразование строкового литерала в TCHAR* является неопределенным поведением, как если бы UNICODE был определен, тогда TCHAR* станет wchar_t*, а строковый литерал не является wchar_t*, и это преобразование указателя не определено.

...