-1

我希望这里有人能理解我认为可能是 MSVC 2010 的错误。

我有这个代码(作为一个更大的项目的一部分):

namespace MyNamespace{

class Foo{
   //snip
   QPointer<MyNamespace::Baz> :: x;
};

class Baz{
   //snip
};

//snip
Foo::Bar(){
   x = new MyNamespace::Baz();
   ThisFunctionWillSegfaultIfXIsNull(x);
   //snip
}

同样,请记住,这是一个更大的项目的一部分,涉及 cmake、qt 和一大堆其他令人兴奋的东西。

我一直在用调试器跟踪这个。当我在调试模式下编译这个项目时,一切都按预期进行。但是,当我将其编译为发布项目时,x 获得的值为 0x0000000000000000。

此外,当在 MSVS 调试器中跟踪它时(仍处于发布模式),会发生一些有趣的事情:

  1. 实际上调用了 Baz 的构造函数,并且“this”在 Baz 的构造函数中具有有效的内存位置。

  2. 从构造函数返回后(返回Foo::Bar()),this(可能是“Foo”)的值现在与 Baz 的构造函数(可能是“Baz”)中的“this”值相同。

  3. Foo 的所有数据似乎都没有丢失,尽管它只是明显地更改了内存地址。

  4. “这个”(作为 Foo)以某种方式神奇地增长了一个 MyNamespace::Baz 类型的新数据成员,其中包含在构造函数期间分配的所有正确数据。

因此,显然编译器优化正在使一些极其神秘的事情发生。同样,这似乎只发生在发布模式下,这让我认为 A) 优化器正在发挥作用,B) 让我很难获得有关实际情况的更多信息。

有没有人见过这个?这里发生了什么?我怎样才能让我的下一个函数停止段错误,因为 X 为空?

4

1 回答 1

1

问题出在其他地方。除了调试器在你身上耍花招(因为它经常在发布模式下发生),new永远不会返回NULL. 如果分配失败,它会抛出一个异常,但它永远不会返回NULL

您可以使用一些调试语句进行检查:

if (x)
   std::cout << "x is not NULL";
于 2012-09-06T17:50:50.187 回答