【问题标题】:Why could i get an Unhandled exception Access violation writing in c++/CLI?为什么我会在 c++/CLI 中得到未处理的异常访问冲突?
【发布时间】:2011-05-04 15:41:16
【问题描述】:

我一直在努力编写一个从 c++ win32console 和 c++ dll 中提取的解决方案。我终于设法让他们在没有链接器错误的情况下交谈(所以我假设两者都是完全托管的 c++/CLI 项目)但是当我运行控制台时,我得到了以下错误。

在 0x03f71849 处未处理的异常 Company.Pins.Bank.Win32Console.exe: 0xC0000005:访问冲突写入 位置 0x00000001。

控制台还显示以下内容

未处理的异常: System.NullReferenceException:对象 引用未设置为 目的。在 c:...\win32console.cpp:line 中的 wmain 20 在 _wmainCRTStartup()

但我假设这是因为未处理的异常。

跟踪这个错误,我可以在下面的代码块中执行返回时发生错误。 (return 链接的方法似乎可以通过,只是返回时似乎变坏了。) .

#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;

编辑: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);
}

【问题讨论】:

  • 您介意分享win32console.cpp吗?
  • 我添加了代码,但它从未在断点处到达它。这可能意味着我为了让它工作而弄坏了一些东西。

标签: visual-studio-2010 visual-c++ c++-cli tchar


【解决方案1】:

你声明了一个指针并且没有初始化它,所以它不指向一个对象(它包含一些垃圾地址):

double* P1;     

然后你尝试写入这个未初始化的指针指向的任何地方:

P1[0] = 13;

您不能使用未初始化的变量。在取消引用之前,您需要初始化 P1 以指向某个对象。

【讨论】:

    【解决方案2】:
    double* P1;
    

    未初始化。然后,您尝试将其第一个条目设置为 13。繁荣、访问冲突或更糟。

    这些 sn-ps 中的任何一个都应该工作:

    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;
    

    【讨论】:

      【解决方案3】:

      以下语句在使用UNICODE构建时也是错误的:

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

      因为您将普通 (char) 数组转换为 wchar_t 指针。

      如果您使用 UNICODE 构建,那么您应该在以下位置进行更改:

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

      【讨论】:

        【解决方案4】:

        将字符串文字转换为TCHAR* 是未定义的行为,就像定义了UNICODE 那么TCHAR* 将变为wchar_t*,而字符串文字不是wchar_t*,并且此指针转换未定义。

        【讨论】:

          【解决方案5】:

          我设法通过以下方式找到错误:

          • 弹出的错误不在行中。
          • 它实际上是在我记忆中的最后一个位置PIN_PTR

          我使用了以下方法来复制向量:

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

          问题是PINED_PRT SIZE &lt; unmanagedVectorSize!愚蠢的错误。

          这弄乱了所有托管内存,后来又增加了几行和函数。

          如何在代码中找到:禁用代码范围,直到代码不崩溃。

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 2020-10-24
            相关资源
            最近更新 更多