Управляемый C ++, ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
1 голос
/ 28 сентября 2011

Я сталкивался с этой проблемой раньше, но никогда в такой ситуации. Я полностью сбит с толку. Как говорится в вопросе, я получаю ошибку во время выполнения «Ссылка на объект не установлена ​​на экземпляр объекта». Используя инструменты отладчика, я думаю, что я определил проблему в этой строке:

dataFileLocation = path;

Вся функция здесь:

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 объявлено здесь, но ему ничего не назначено:

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

Теперь я знаю причину, по которой я получаю ошибку, потому что dataFileLocation ничего не назначено. Но у меня проблемы с его назначением. Когда я добавлю = 0; к нему, он не будет собираться, потому что это класс ref. Когда я пытаюсь присвоить его = 0; в конструкторе, он кричит на меня за попытку преобразовать его из System::String^ в int. Если я присваиваю его = gcnew String("");, он строит, но выдает то же исключение во время выполнения.

Я не понимаю, я неправильно читаю отладчик, и это вовсе не является источником проблемы? Я только недавно начал использовать управляемый код, поэтому я в замешательстве: \

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Возможно, вы захотите проверить и убедиться, что ваш объект DATReader также не равен нулю. Возможно, он вызывает исключение при вызове DATReader.SetPath ().

2 голосов
/ 29 сентября 2011

Это тонкость в C #, чего нет в C ++ / CLI.C # генерирует код, который гарантирует, что this никогда не может быть нулевым.Легко увидеть в отладчике, установив точку останова на методе и проверив «это».Вот пример программы, которая воспроизводит исключение:

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

Удалите комментарии / * * / для исправления.Исправьте свой код, посмотрев на стек вызовов, чтобы найти метод, который забыл создать экземпляр объекта.

1 голос
/ 28 сентября 2011

Управляемый C ++ использует nullptr для нулевых ссылок. Таким образом, вы можете проверить:

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

или используйте:

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