C++ 在初始值设定项列表中使用临时变量会导致access vialotion错误

C++ 在初始值设定项列表中使用临时变量会导致access vialotion错误,c++,c++11,C++,C++11,我试图使用初始值设定项\u list实例化一个类,但出现了有线错误 尝试使用以下命令创建“ClassB”变量时: ClassB b = { { 1, {} }, { 2, {} }; 将发生内存访问冲突。但是,如果更改为: ClassA a0, a1; ClassB b = { { 1, a0 }, { 2, a1 } }; 错误消失了 我试着用VC2013(没有更新1)和gcc-c++4.8.1进行编译。使用gcc-c++4.8.1不会产生任何运行时错误。这是VC中的一个bug吗 有人能帮

我试图使用
初始值设定项\u list
实例化一个类,但出现了有线错误

尝试使用以下命令创建“ClassB”变量时:

ClassB b = { { 1, {} }, { 2, {} };
将发生内存访问冲突。但是,如果更改为:

ClassA a0, a1;
ClassB b = { { 1, a0 }, { 2, a1 } };
错误消失了

我试着用VC2013(没有更新1)和gcc-c++4.8.1进行编译。使用gcc-c++4.8.1不会产生任何运行时错误。这是VC中的一个bug吗

有人能帮忙确认一下吗?谢谢

以下是SSCCE:

#include <iostream>
#include <initializer_list>
#include <map>
#include <vector>
#include <memory>

using namespace std;

struct ClassA {
  struct Data {
    vector<int> vs;
  };
  unique_ptr<Data> d;

  ClassA() : d(new Data()) {}
  ClassA(const ClassA& a) : ClassA() {
    *d = *(a.d);
  }
};

struct ClassB {
  ClassB(initializer_list<pair<const int, ClassA> > v) { as = v; }
  map<int, ClassA> as;
};

int main() {
  ClassA a0, a1;
  // ClassB b = { { 1, a0 }, { 2, a1 } };     // won't crash in VC
  ClassB b = { { 1, {} }, { 2, {} } };
  return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构类A{
结构数据{
向量vs;
};
独特的ptr d;
ClassA():d(新数据()){}
ClassA(const ClassA&a):ClassA(){
*d=*(a.d);
}
};
结构类B{
ClassB(初始值设定项列表v){as=v;}
地图为;
};
int main(){
A类a0、a1;
//ClassB b={{1,a0},{2,a1};//在VC中不会崩溃
类b={{1,{}},{2,{}};
返回0;
}

问题在于,当指针超出范围时,unique_ptr提供自动对象销毁功能。 如果你改变

  unique_ptr<Data> d;
它将正常工作:

    b.as.begin()->second.d->vs.push_back(1);

我并不是说这一定是(唯一的)解决方案,也是解决这个问题的正确方法。

unique\u ptr
不是这里的问题。因此,请您解释一下为什么删除它会使运行时错误消失?通过使用普通指针而不是
unique\u ptr
您使用的是另一种技术。这消除了错误,但是使用
unique\u ptr
的原始技术也应该起作用。问题的根源不是
unique\u ptr
,而是VS2013中的一个bug。同意,但这不是我在文章末尾所说的吗?我忽略了向下投票的原因。“问题是unique_ptr在指针超出范围时提供自动对象销毁。”——这不是问题所在。
    b.as.begin()->second.d->vs.push_back(1);