3

我试图运行 Bjarne Stroustrup 编写的新 C++ 编程语言书中的代码似乎不起作用。哪个编译器支持S y {x};代码中的语法?无法编译,我尝试了g++,vc++,还没有Clang,那个错误代码应该是一个初始化,之后,我将该代码更改为S y = x;一个赋值,但没有将结果输出为注释,我在哪里错了吗?

struct S {
     int* p;    // a pointer
};

S x {new int{0}};
void f()
{
     S y {x};              // "copy" x

     *y.p = 1;             // change y; affects x
     *x.p = 2;             // change x; affects y
     delete y.p;           // affects x and y
     y.p = new int{3};     // OK: change y; does not affect x
     *x.p = 4;             // oops: write to deallocated memory
}

然后我用 C++03 版本重写了代码,它按照描述的方式工作,如下所示:

struct S
{
    int *p;  
};

int main()
{
   S x;
   x.p = new int;
   *(x.p) = 0;

   S y = x;
   *y.p = 1;
   *x.p = 2;
   delete y.p;
   y.p = NULL;
   x.p = NULL;
   y.p = new int;
   *(y.p) = 3;
   *(x.p)= 4;
}

是不是有什么魔力,或者只是书中的代码不正确。任何建议谢谢。

4

2 回答 2

6

这是 C++11 措辞的一个已知问题。C++14 CD 也没有修复此问题(请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1467以获取相应的 DR)。

我们可以希望编译器能够在其 C++11 和 C++14 模式中追溯地对此进行修复。下一个问题列表修订版应包含解决此问题的问题 1467 的建议措辞。

于 2013-07-30T19:27:09.873 回答
1

在 line 之后,和delete y.p;指向的内存被释放。因此现在指向释放的内存。x.py.px.p

在 line 之后y.p = new int{3};, xp 和 yp 不再指向同一个内存,因为指针 y.p已被重新分配。

x.p仍然指向该delete行中已释放的内存,因此当您尝试取消引用它时,您会遇到段错误。

于 2013-07-30T04:22:09.450 回答