2011-09-28 64 views
1

我以前遇到过这个问题,但从未出现过这种情况。我完全困惑。如问题所述,我得到运行时错误“对象引用未设置为对象的实例”。使用调试工具,我想我已经精确定位问题这一行:托管C++,未将对象引用设置为对象的实例

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被分配到nothi NG。但我在分配时遇到问题。当我添加= 0;时,它不会生成,因为它是一个ref类。当我尝试在构造函数中将它分配给= 0;时,它试图将它从System::String^转换为int,然后大叫我。如果我将它分配给= gcnew String("");它会生成,但会引发相同的运行时异常。

我不明白,我读错了调试器,这根本不是问题的根源吗?我刚刚开始使用托管代码,因此我很困惑:\

+0

你确定它不是'path'是null吗? – ildjarn

+0

路径为空应该不会导致该行发生错误 - 如果错误位于不同的行上,则可能是正确的。 –

回答

1

托管C++对空引用使用nullptr。所以,你可以检查:

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

或使用:

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

谢谢!我完全忘了关于nullptr关键字。 – smoth190

3

您可能要检查并确保您的DATReader对象不为null,以及它可能在你DATReader.SetPath被抛出异常()调用。

+0

我可以批准这一点,我现在有这样的错误。在调试时,DATReader对象似乎已经创建好了,我可以进入它的方法,只是在第一行失败。但是,我给出的参数没有错,它只是DATReader参数为null ... –

2

这是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; 
} 

删除/ * * /注释以解决问题。通过查看调用堆栈来查找忘记实例化对象的方法,从而修复代码。

相关问题