开发者

Managed C++, Object reference not set to an instance of an object

开发者 https://www.devze.com 2023-04-08 05:12 出处:网络
I\'ve run into this problem before, but never in a situation like this. I\'m completely confused. As the question states, I\'m getting the runtime error \"Object reference not set to an instance of an

I've run into this problem before, but never in a situation like this. I'm completely confused. As the question states, I'm getting the runtime error "Object reference not set to an instance of an object." Using the debugger tools, I think I've pinpointed the problem to this line:

dataFileLocation = path;

The entire function is here:

void DATReader::SetPath(String^ path) 
{
    if(!File::Exists(path))
    {
        MessageBox::Show( "DATReader (missing dat file: \n"+path+"\n )", "Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
        return;
    }
    dataFileLocation = path;
}

dataFileLocation is declared here, but nothing is assigned to it:

ref class DATReader
{
private:
    System::String^ dataFileLocation;
    // ...
}

Now I know the reason I'm getting the error is because dataFileLocation is assigned to nothing. But I'm having problems assigning it. When I add = 0; to it, it won't build because its a ref class. When I try to assigned it to = 0; in the constructor, it yells at me for trying to convert it from a System::String^ to an int. If I assign it to a = gcnew String(""); it builds, but th开发者_StackOverflow中文版rows the same runtime exception.

I don't get it, am I reading the debugger wrong, and this isn't the source of the problem at all? I've just started to use managed code recently, so I'm confused :\


You may want to check and make sure your DATReader object isn't null as well It may be throwing the exception at your DATReader.SetPath() call.


This is a nicety in C# that's missing in C++/CLI. C# generates code that ensures this can never be null. Easily seen in the debugger by setting a breakpoint on the method and inspecting "this". Here's an example program that reproduces the exception:

#include "stdafx.h"

using namespace System;

ref class Example {
    String^ dataFileLocation;
public:
    void SetPath(String^ path) { 
        dataFileLocation = path;   // Set breakpoint here and inspect "this"
    }
};

int main(array<System::String ^> ^args)
{
    Example^ obj /* = gcnew Example */;
    obj->SetPath("foo");
    return 0;
}

Remove the /* */ comments to fix. Fix your code by looking at the call stack to find the method that forgot to instantiate the object.


Managed C++ uses nullptr for null references. So you can check:

if (path == nullptr) { ... }

or use:

if (!String::IsNullOrEmpty(path))
0

精彩评论

暂无评论...
验证码 换一张
取 消