c++ - 在 initializer_list 中使用临时变量会导致访问错误

标签 c++ c++11

<分区>

我正在尝试使用 initializer_list 来实例化一个类,但出现了连线错误。

当尝试使用以下方法创建 `ClassB`` 变量时:

ClassB b = { { 1, {} }, { 2, {} };

将发生内存访问冲突。但是,如果更改为:

ClassA a0, a1;
ClassB b = { { 1, a0 }, { 2, a1 } };

错误消失。

我尝试使用 VC 2013(没有更新 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;
}

最佳答案

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

  unique_ptr<Data> d;

    Data * d;

它会正常工作:

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

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

关于c++ - 在 initializer_list 中使用临时变量会导致访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415942/

相关文章:

c++ - Qt 文件被报告为病毒并且无法启动

c++ - 处理具有不同类型参数的 std::basic_string<>

c++ - C++ 编译器如何在 C++0x 中实现线程本地存储?

c++ - 正确使用 std::enable_if 或如何替换它

c++ - 在不传递所有权的情况下重新分配函数中的智能指针?

c++ - 获取 "undefined reference to"

c++ - 尽管链接正确,但未定义的 boost 引用

c++ - 复制省略导致不同的结果

c++ - 如何检查一个类是否在 C++ 中声明?

c++11 - Sfinae 和模板特化