C++11 为什么可以';我是否使用括号内的初始值设定项列表来调用复制构造函数? 我试图从Bjarne Stroustrup编写的新C++编程语言中运行代码,好像不起作用。哪个编译器支持语法〈代码〉sy{x}在代码中?无法编译,我尝试了g++,vc++,还没有发出叮当声,错误代码假设是初始化,之后,我将代码更改为sy=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++11 为什么可以';我是否使用括号内的初始值设定项列表来调用复制构造函数? 我试图从Bjarne Stroustrup编写的新C++编程语言中运行代码,好像不起作用。哪个编译器支持语法〈代码〉sy{x}在代码中?无法编译,我尝试了g++,vc++,还没有发出叮当声,错误代码假设是初始化,之后,我将代码更改为sy=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++11,C++11,然后我在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; } 是有什

然后我在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;
}

是有什么神奇的东西在背后,还是书中的代码不正确。任何建议,谢谢

行后
删除y.p
,由
x.p
y.p
指向的内存被释放。因此
x.p
现在指向释放的内存

y.p=newint{3}行之后、x.p和y.p不再指向同一内存,因为已重新分配指针
y.p


x.p
仍然指向
delete
行中解除分配的内存,因此当您尝试解除对它的引用时,会出现seg错误。

这是C++11语言的已知问题。C++14 CD也没有修复此问题(请参阅相应的DR)


我们希望编译器能够在其C++11和C++14模式中追溯性地实现将来的修复。下一次问题清单修订应包含解决此问题的1467号问题的建议措辞

您使用的是上述编译器的哪个版本?使用g++4.7.x及以上版本(4.8.1是c++11功能的完整版本)。@Koushik,g++4.7.3。我在windows上使用的是cygwin,它支持g++高达4.7.3VC++不支持统一的初始化语法(“花括号”初始化)g++/clang会,但他们需要在命令行上使用“-std=c++11”。@zyangpointer,你的编译器错误消息是什么?你到底是如何编译这个程序的?@zyangpointer,所以,请编辑这个问题以消除歧义。您可以使用,它完整地描述了您的问题。为了澄清:
x.p
y.p
可以在重新分配
y.p
后指向相同的内存,如果内存分配在相同的地址中。这是UB,这个代码可能会也可能不会导致SEGFULT。但答案是正确的,+1。这不是要问的问题。。。所问的问题与编译错误有关。@omnintentity,我不这么认为。引述问题:“……但没有将结果作为评论输出,我在什么地方错了吗?”。另外,标题是:“…似乎不起作用”,而不是“…似乎不编译”。我可能高估了OP,但这个问题实际上包含了程序评论中发布的答案。。。他还特别指出了他不理解/有问题的代码的一部分,大括号初始化的复制构造函数…@Omnipontentity我想自从我发布我的答案后,它已经被编辑过了,OP没有说明最初的问题是什么