2014-11-25 199 views
0

我已经在使用Objective-C++的iOS项目中调整了Matt Gallagher的"Testing if an arbitrary pointer is a valid object pointer"。它与Objective-C对象一起工作良好,但它始终告诉我,无论C++指针是否工作,我的C++指针都是无效的。有时代码会在指针处崩溃。有时代码工作正常。但是测试方法总是告诉我指针是错误的。检查C++指针是否有效(在Objective-C(++)中)

在这里任何人都知道将此代码调整为C++类和对象吗?我可以想象,根据“类”的使用,代码只与Objective-C一起工作。

+0

当您检查指针是否有效时,您是否尝试过使用'nullptr'?如果你想检查有效数据,那么你需要取消引用指针,如果指针本身无效,这将导致exc_bad_access(segfault)。截至目前,我不认为有任何方法可以实际检查数据。 – 2014-11-25 12:31:51

+1

该方法对Apple的Objective-C实现非常具体,最多也不可靠。对于C++来说,没有办法做类似的事情,正如作者指出的那样,“不要在生产代码中使用它”。 – molbdnilo 2014-11-25 12:33:31

+0

@AlexanderW是的,我们正在检查nullptr,null,nil,0 ...但是代码有时总是继续执行,然后崩溃,然后用EXC_BAD_ACCESS找不到... => molbdnilo我们仅使用它来编写调试日志以获取有关我们内部测试人员工作流程的详细信息。他们通常不会正确地报告崩溃... – 2014-11-25 12:36:00

回答

1

指针变量的内容是:空指针,指向对象的有效指针,指向数组元素的有效指针或者超过数组的最后一个元素,或者某个无效指针。

如果它是一个无效的指针,然后任何试图使用它调用未定义的行为。这包括任何试图检查它是一个无效的指针。那里你卡住了。你所能做的只是检查它是否是空指针,或者它是否等于其他有效指针。

你应该使用Objective-C哲学:试图使用无效指针是一个编程错误。您不会尝试在运行时检测并处理此问题。你让它崩溃并修复你的代码中的错误。

1

C++指针只是引用内存中的地址。您可以使用内存查看器工具查看内存中的内容,但这甚至不能保证内存仍然有效。例如:

char* test = new[13]; 

strcpy(test, "Hello World!"); 
delete[] test; 
. 
. 
. 
printf("%s", test); 

在某些情况下,这将成功打印。有时它会打印一个垃圾字符串。有时候会出现段错误。没有什么可以说明指针的有效性的。

如果您正在寻找在刚刚segfaulted程序和你想看看发生了什么有给你提供几个选择:

  • 你可以看一下通过内存观众,结合你错误的线路可以提供见解。
  • 你可以在跑步之前播种你的记忆,使之更清晰地使用0xbadfood5或类似的东西。
  • 使用Valgrind运行时是一个很好的工具,如果你可以处理开销。

最好的选择是在你的代码中进行错误检查。这听起来像你没有,或者你不会在这里。先决条件和后置条件非常好,从长远来看可以为您节省大量时间(就像现在一样)。然而,作为一线希望,您应该利用这一点来确保组织中未来的编码标准更好。